/**
 * Traversals that carry an environment.
 */
module strategy/traversal/list-environment
imports 
  strategy/traversal/environment
  strategy/traversal/list
rules

  all-l-dist(s) : 
    (t, env) -> <all-l(\x -> <s>(x,env)\)> t

strategies

  env-alltd-l(s) = 
    rec x(s <+ all-l-dist(x))

  env-topdown-l(s) = 
    rec x(s; all-l-dist(x))

  env-topdown-l(s, skip: (term -> term) * term -> term) = 
    rec x(s; (skip(x) <+ all-l-dist(x)))

  env-bottomup-l(s) = 
    rec x(split(all-l-dist(x), Snd); s)