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
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 []

Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?