def deref

ezmcp@0.1.0.0 · src/openapi.bend:360

import ezmcp@0.1.0.0/src/openapi.bend as Openapi
import Base
import emerging-ezjson@1.2.0.0/src/value.bend as Value

360# a value with every local reference in it replaced by its target, merged
361# with the reference object's other members (`merge`); a reference to one
362# of `refs`, the references being followed, is a cycle (`cyclic`), and one
363# that does not resolve is left as it is. `fuel` bounds how deep values and
364# references nest
365def deref(
366  fuel: Nat,
367  val: Value.Json,
368  +doc: Value.Json,
369  +refs: List<&2, String>
370) -> Value.Json:
371  match fuel:
372    case 0n:
373      val
374    case 1n+(+less):
375      match val:
376        case Value.JObj{+pairs}:
377          deref.obj(ref.of(pairs), doc, refs,
378            _u => Value.JObj{deref(1n+less, pairs, doc, refs)},
379            ref => target => deref(less, target, doc, ref <> refs))
380        case Value.JArr{items}:
381          Value.JArr{deref(1n+less, items, doc, refs)}
382        case Value.JCons{head, tail}:
383          Value.JCons{deref(1n+less, head, doc, refs),
384            deref(1n+less, tail, doc, refs)}
385        case Value.JPair{key, item, rest}:
386          Value.JPair{key, deref(1n+less, item, doc, refs),
387            deref(1n+less, rest, doc, refs)}
388        case Value.JBind{src, n, item, rest}:
389          Value.JBind{src, n, deref(1n+less, item, doc, refs),
390            deref(1n+less, rest, doc, refs)}
391        case other:
392          other

Uses (6)

Used by (1)