use(require(“atomy”))

data = require(“anatomy/data”)

def(pass(a & Array, info)):

a collect [x]: pass(x, info)

def(pass(x & (data TraverseBlock | data TraverseElement), info)):

new = x action[info]

when(new != x):
  signal(.changed)

new

def(pass(x, _)): x

def(over(part)):

info = #{}

changed? = true
while(changed?):
  &changed? = false

  (part body = pass(part body, info)) bind:
    .changed:
      &changed? = true

part parts each [p]:
  over(p)

part