/** * Traversals that carry an environment. */ module strategy/traversal/environment rules all-dist(s) : (t, env) -> <all(\x -> <s>(x,env)\)> t one-dist(s) : (t, env) -> <one(\x -> <s>(x,env)\)> t d(s) : (t, env) -> <s> t t(s) : (t, env) -> (<s>t, env) coll(s) : f#(xs) -> (f#(ys), zs) where <unzip(s)> xs => (ys, zs) strategies env-alltd(s) = rec x(s <+ all-dist(x)) env-topdown(s) = rec x(s; all-dist(x)) env-topdown(s, skip: (term -> term) * term -> term) = rec x(s; (skip(x) <+ all-dist(x))) env-bottomup(s) = rec x(split(all-dist(x), Snd); s) /* thread(s) : (c#(ts), x) -> (c#(ts'), y) where <thread-map(s)> (ts, x) => (ts', y) */ thread-replacement(s) : (c#(ts), x) -> (c#(ts'), y) where <thread-map(s)> (ts, x) => (ts', y) thread-alltd(s) = rec x(s <+ thread-replacement(x)) thread-bottomup(s) = rec x(thread-replacement(x); s) count-bottomup(s) = !(<id>,0); thread-bottomup(try((s, inc))) env-oncetd(s) = rec x(s <+ one-dist(x))