use(require(“atomy”))

data = require(“anatomy/data”)

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

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

def(pass(c & data ResolveElement, part)):

pass(c action[part], part)

def(pass(x & (data Reference | data Target), part)):

x

def(pass(e & data Element, part)):

unless(e class == data Element):
  warning(.did-not-traverse(e class))

e dup tap [x]:
  x content = pass(e content, part)

def(pass(i & data Itemization, part)):

i dup tap [x]:
  x elements = i elements collect [name, body]:
    [ pass(name, part)
      pass(body, part)
    ]

def(pass(l & data List, part)):

l dup tap [x]:
  x elements = l elements collect [body]:
    pass(body, part)

def(pass(p & data Paragraph, part)):

p dup tap [x]:
  x content = pass(p content, part)

def(pass(c & data ResolveBlock, part)):

pass(c action[part], part)

def(pass(b & data Block, part)):

unless(b class == data Block):
  warning(.did-not-traverse(b class))

b dup tap [x]:
  x content = pass(b content, part)

def(pass(s & String, _)): s

def(pass(nil, _)): nil

def(over(part)):

part body = pass(part body, part)
part parts each [sub]: over(sub)
part