(* stream.sml *) (* implementation of streams *) structure Stream :> STREAM = struct datatype 'a stream = Stream of ('a * 'a stream)Susp.susp fun make(state, f) = let fun g state = Stream (Susp.delay (fn () => let val (x, state) = f state in (x, g state) end)) in g state end fun get(Stream x) = Susp.force x fun takeToList(stm, n) = let fun tke(stm, n, xs) = if n <= 0 then rev xs else let val (x, stm) = get stm in tke(stm, n - 1, x :: xs) end in tke(stm, n, nil) end fun drop(stm, n) = if n <= 0 then stm else let val (_, stm) = get stm in drop(stm, n - 1) end fun rangeToList(stm, n, m) = if n <= 0 orelse m < n then nil else takeToList(drop(stm, n - 1), m - n + 1) end;