~/bend-docscommunity

lib.bend source

lib.bend on the hub · documented module

# Stack — foundational LIFO stack for Bend.# Publish entry for this package. Depends only on Base (does not reimplement List).## Encoding: a thin wrapper over List with the top at the list head.# to_list is top-first (list head = stack top), not bottom-first.# Quantity: Stack<a, A> is Kind(a), same convention as List/Maybe.import Basetype Stack<a, -A: Kind(a)> is Kind(a):  S{data: List<a, A>}# Pop view: head + remaining stack.type Stack.Pop<a, -A: Kind(a)> is Kind(a):  HD{head: A, rest: Stack<a, A>}def Stack.empty(a, -A: Kind(a)) -> Stack<a, A>:  S{Nil{}}def Stack.push(a, -A: Kind(a), s: Stack<a, A>, x: A) -> Stack<a, A>:  match s:    case S{xs}:      S{x <> xs}def Stack.pop.go(a, -A: Kind(a), s: Stack<a, A>) -> Maybe<a, Stack.Pop<a, A>>:  match s:    case S{xs}:      match xs:        case Nil{}:          None{}        case h <> t:          Some{HD{h, S{t}}}def Stack.pop(a, -A: Kind(a), s: Stack<a, A>) -> Maybe<a, Stack.Pop<a, A>>:  Stack.pop.go(a, A, s)def Stack.peek.go(a, -A: Kind(a), s: Stack<a, A>) -> Maybe<a, A>:  match s:    case S{xs}:      match xs:        case Nil{}:          None{}        case h <> t:          Some{h}def Stack.peek(a, -A: Kind(a), s: Stack<a, A>) -> Maybe<a, A>:  Stack.peek.go(a, A, s)def Stack.is_empty(a, -A: Kind(a), s: Stack<a, A>) -> Bool:  match s:    case S{xs}:      List.is_empty(a, A, xs)def Stack.length(a, -A: Kind(a), s: Stack<a, A>) -> Nat:  match s:    case S{xs}:      List.length(a, A, xs)def Stack.to_list(a, -A: Kind(a), s: Stack<a, A>) -> List<a, A>:  match s:    case S{xs}:      xsdef Stack.from_list(a, -A: Kind(a), xs: List<a, A>) -> Stack<a, A>:  S{xs}