Thursday, October 05, 2006
deepSeq
I was implemented a 'deepSeq' function which evaluates every thunk in the argument. It can be instantiate for user defined types because it is defined as a generic function.
DeepSeq.dcl
DeepSeq.icl
DeepSeq.dcl
definition module DeepSeq
import StdGeneric, GenBimap
deepSeq :== gDeepSeq{|*|}
generic gDeepSeq a :: !a !.w -> (!a,!.w)
derive gDeepSeq Int, Real, Char, Bool, {}, {!}, {#}
derive gDeepSeq UNIT, PAIR, EITHER, CONS, FIELD, OBJECT
derive gDeepSeq []
DeepSeq.icl
implementation module DeepSeq
import StdEnv, StdGeneric, GenBimap
deepSeq :== gDeepSeq{|*|}
generic gDeepSeq a :: !a !.w -> (!a,!.w)
gDeepSeq {|Int|} a w = (a,w)
gDeepSeq {|Real|} a w = (a,w)
gDeepSeq {|Char|} a w = (a,w)
gDeepSeq {|Bool|} a w = (a,w)
gDeepSeq {|UNIT|} a w = (a,w)
gDeepSeq {|{}|} f a w = seqArray f a w
gDeepSeq {|{!}|} f a w = (a,w)
gDeepSeq {|{#}|} f a w = (a,w)
gDeepSeq {|PAIR|} fx fy (PAIR a1 a2) w # (a1,w) = fx a1 w
(a2,w) = fy a2 w
= (PAIR a1 a2,w)
gDeepSeq {|EITHER|} fl fr (LEFT a) w # (a,w) = fl a w
= (LEFT a,w)
gDeepSeq {|EITHER|} fl fr (RIGHT a) w # (a,w) = fr a w
= (RIGHT a,w)
gDeepSeq {|CONS|} f (CONS a) w # (a,w) = f a w
= (CONS a,w)
gDeepSeq {|FIELD|} f (FIELD a) w # (a,w) = f a w
= (FIELD a,w)
gDeepSeq {|OBJECT|} f (OBJECT a) w # (a,w) = f a w
= (OBJECT a,w)
seqArray f ar w = seqArray 0 ar w
where
s = size ar
seqArray i ar w | i >= s = (ar,w)
seqArray i ar w # (_,w) = f ar.[i] w
= seqArray (inc i) ar w
derive gDeepSeq []