~/bend-docscommunity

lib.bend source

lib.bend on the hub · documented module

# Queue — foundational two-list FIFO for Bend.# Publish entry for this package. Depends only on Base (does not reimplement List).## Encoding: front + rear (rear stored reversed). Amortized O(1) enqueue/dequeue# via Queue.norm (rotate rear→front when front is empty).# Quantity: Queue<a, A> is Kind(a), same convention as List/Maybe.import Basetype Queue<a, -A: Kind(a)> is Kind(a):  Q{front: List<a, A>, rear: List<a, A>}# Dequeue view: head + rest queue (Kind-friendly; A & Queue is Type, not Kind(a)).type Queue.Deq<a, -A: Kind(a)> is Kind(a):  HD{head: A, rest: Queue<a, A>}def Queue.empty(a, -A: Kind(a)) -> Queue<a, A>:  Q{Nil{}, Nil{}}def Queue.enqueue(a, -A: Kind(a), q: Queue<a, A>, x: A) -> Queue<a, A>:  match q:    case Q{f, r}:      Q{f, x <> r}# When front is empty, reverse rear into front (and clear rear).def Queue.norm(a, -A: Kind(a), q: Queue<a, A>) -> Queue<a, A>:  match q:    case Q{f, r}:      match f:        case Nil{}:          Q{List.reverse(a, A, r), Nil{}}        case h <> t:          Q{h <> t, r}def Queue.dequeue.go(a, -A: Kind(a), q: Queue<a, A>) -> Maybe<a, Queue.Deq<a, A>>:  match q:    case Q{f, r}:      match f:        case Nil{}:          None{}        case h <> t:          Some{HD{h, Q{t, r}}}def Queue.dequeue(a, -A: Kind(a), q: Queue<a, A>) -> Maybe<a, Queue.Deq<a, A>>:  Queue.dequeue.go(a, A, Queue.norm(a, A, q))def Queue.peek.go(a, -A: Kind(a), q: Queue<a, A>) -> Maybe<a, A>:  match q:    case Q{f, r}:      match f:        case Nil{}:          None{}        case h <> t:          Some{h}def Queue.peek(a, -A: Kind(a), q: Queue<a, A>) -> Maybe<a, A>:  Queue.peek.go(a, A, Queue.norm(a, A, q))def Queue.is_empty(a, -A: Kind(a), q: Queue<a, A>) -> Bool:  match q:    case Q{f, r}:      match f:        case Nil{}:          List.is_empty(a, A, r)        case h <> t:          False{}def Queue.length(a, -A: Kind(a), q: Queue<a, A>) -> Nat:  match q:    case Q{f, r}:      Nat.add(List.length(a, A, f), List.length(a, A, r))# FIFO order: front ++ reverse(rear).def Queue.to_list(a, -A: Kind(a), q: Queue<a, A>) -> List<a, A>:  match q:    case Q{f, r}:      List.append(a, A, f, List.reverse(a, A, r))def Queue.from_list(a, -A: Kind(a), xs: List<a, A>) -> Queue<a, A>:  Q{xs, Nil{}}