pub opaque type AssocList { inner: List<#(key, value)>, } pub fn new() -> AssocList { AssocList { inner: [] } } pub fn to_list(m: AssocList) -> List<#(key, value)> { m.inner } pub fn insert( in m: AssocList, key k: key, value v: value, ) -> AssocList { AssocList { inner: do_insert(m.inner, k, v) } } fn do_insert( elems: List<#(key, value)>, k: key, v: value, ) -> List<#(key, value)> { when elems is { [] -> [#(k, v)] [#(k2, v2), ..rest] -> if k == k2 { [#(k, v), ..rest] } else { [#(k2, v2), ..do_insert(rest, k, v)] } } } fn fixture_1() { new() |> insert("foo", 42) |> insert("bar", 14) } test to_list_2() { to_list(fixture_1()) == [#("foo", 42), #("bar", 14)] }