~/bend-docscommunity

model.bend source

model.bend on the hub · documented module

# SPDX-License-Identifier: MIT-0import Base# Independent association list: no trie, key bits, or implementation import.type Item<-V: Data> is Data:  Item{key: U32, value: V}def choose(-V: Data, same: Bool, v: V, rest: Maybe<&2,V>) -> Maybe<&2,V>:  match same:    case False{}: rest    case True{}: Some{v}def get(-V: Data, xs: List<&2,Item<V>>, +key: U32) -> Maybe<&2,V>:  match xs:    case Nil{}: None{}    case Con{Item{k,v},tail}: choose(V,U32.is_eq(k,key),v,get(V,tail,key))def keep(-V: Data, same: Bool, x: Item<V>, tail: List<&2,Item<V>>) -> List<&2,Item<V>>:  match same:    case False{}: Con{x,tail}    case True{}: taildef remove(-V: Data, xs: List<&2,Item<V>>, +key: U32) -> List<&2,Item<V>>:  match xs:    case Nil{}: Nil{}    case Con{Item{+k,v},tail}: keep(V,U32.is_eq(k,key),Item{k,v},remove(V,tail,key))def set(-V: Data, xs: List<&2,Item<V>>, +key: U32, v: V) -> List<&2,Item<V>>:  Con{Item{key,v},remove(V,xs,key)}def size(-V: Data, xs: List<&2,Item<V>>) -> Nat:  match xs:    case Nil{}: 0n    case Con{x,tail}: 1n+size(V,tail)def merged(~V: Data, ~f: V -> V -> V, old: Maybe<&2,V>, v: V) -> V:  match old:    case None{}: v    case Some{x}: f(x,v)def union_with(~V: Data, ~f: V -> V -> V, right: List<&2,Item<V>>, +left: List<&2,Item<V>>) -> List<&2,Item<V>>:  match right:    case Nil{}: left    case Con{Item{+k,v},tail}:      union_with(~V,~f,tail,set(V,left,k,merged(~V,~f,get(V,left,k),v)))