% $Id: HailstoneDD.oz,v 1.2 2008/01/05 20:14:29 leavens Exp leavens $ \insert 'HailstoneMax.oz' declare %% The following is based on DGenerate from page 262 of CTM %% It puts its outputs on X|Xr proc {DDCount N X|Xr} X=N {DDCount N+1 Xr} end %% DDTake returns Limit items from Pairs, where it puts its demands fun {DDTake ?Pairs Limit} if 0 < Limit then P|Pr = Pairs in P | {DDTake Pr Limit-1} else nil end end %% Return a list of the numbers from 1 to NumberSought fun {UpTo NumberSought} Numbers OutStream in thread {DDCount 1 Numbers} end thread OutStream = {DDTake Numbers NumberSought} end OutStream end %% DDGraph puts demands on List and puts outputs on P|Pr proc {DDGraph ?List P|Pr F} Arg|Args = List in P=Arg#{F Arg} {DDGraph Args Pr F} end %% DDPeaks puts demands on List and puts outputs on P|Pr proc {DDPeaks ?List P|Pr MaxSoFar} (Arg#Val)|Lr = List in if Val > MaxSoFar then P = (Arg#Val) {DDPeaks Lr Pr Val} else {DDPeaks Lr P|Pr MaxSoFar} end end fun {DDGraphMaxHailstone NumberSought} Numbers InStream OutStream in thread {DDCount 1 Numbers} end thread {DDGraph Numbers InStream HailstoneMax} end thread OutStream = {DDTake InStream NumberSought} end OutStream end fun {DDGraphMaxPeaks NumberSought} Numbers InStream PeakStream OutStream in thread {DDCount 1 Numbers} end thread {DDGraph Numbers InStream HailstoneMax} end thread {DDPeaks InStream PeakStream 0} end thread OutStream = {DDTake PeakStream NumberSought} end OutStream end