def factaux [n:Int count:Int ch:^Int] = (new br:^Bool ==![n 0 (rchan br) | br?b = if b then ch!count else (new enneminusone:^Int new prod:^Int -![n 1 (rchan enneminusone)] *![n count (rchan prod) | enneminusone?m = prod?p = factaux![m p ch] ) def fact [n:Int ch:^ch] = factaux![n 1 ch]