pub opaque type Rule(t, error)
pub fn apply(data: a, rule: Rule(a, b)) -> Result(a, b)
pub fn new(rule: fn(a) -> Result(a, b)) -> Rule(a, b)
pub fn then(rule: Rule(a, b), then_do: Rule(a, b)) -> Rule(a, b)