general/rose/ops.bend source
general/rose/ops.bend on the hub · documented module
import Baseimport ./type.bend as Rdef key(-N: Data, r: R.Rose<N>) -> String: match r: case R.Rose{k, _, _}: k# Every key in a forest, each tree's own key before its children's.def keys(-N: Data, rs: List<&2, R.Rose<N>>) -> List<&2, String>: match rs: case []: [] case r <> rest: match r: case R.Rose{k, _, kids}: k <> List.append(&2, String, keys(N, kids), keys(N, rest))# The first key of a list, "" for none.def first(xs: List<&2, String>) -> String: match xs: case []: "" case x <> _: x# Where a key sits: the keys above it, nearest first.type Place is Data: Place{key: String, above: List<&2, String>}def places(-N: Data, rs: List<&2, R.Rose<N>>, +above: List<&2, String>) -> List<&2, Place>: match rs: case []: [] case r <> rest: match r: case R.Rose{+k, _, kids}: Place{k, above} <> List.append(&2, Place, places(N, kids, k <> above), places(N, rest, above))def found(-N: Data, hit: Bool, v: N, below: Maybe<&2, N>, after: Maybe<&2, N>) -> Maybe<&2, N>: match hit: case True{}: Some{v} case False{}: Maybe.or(&2, N, below, after)# The value at a key, if the forest has it.def find(-N: Data, +k: String, rs: List<&2, R.Rose<N>>) -> Maybe<&2, N>: match rs: case []: None{} case r <> rest: match r: case R.Rose{rk, v, kids}: found(N, String.eq(k, rk), v, find(N, k, kids), find(N, k, rest))