3 | import Derive.Prelude
5 | %language ElabReflection
12 | record Queue a where
25 | fromList : List a -> Queue a
26 | fromList vs = Q vs [<]
31 | fromSnocList : SnocList a -> Queue a
32 | fromSnocList sv = Q [] sv
37 | toSnocList : Queue a -> SnocList a
38 | toSnocList (Q f b) = b <>< f
42 | enqueue : Queue a -> a -> Queue a
43 | enqueue (Q f b) v = Q f (b :< v)
47 | enqueueAll : Queue a -> List a -> Queue a
48 | enqueueAll (Q f b) vs = Q f (b <>< vs)
58 | dequeue : Queue a -> Maybe (a, Queue a)
59 | dequeue (Q front back) =
61 | h::t => Just (h, Q t back)
64 | h::t => Just (h, Q t [<])
74 | prepend : a -> Queue a -> Queue a
75 | prepend x (Q f b) = Q (x::f) b
85 | peekOldest : Queue a -> Maybe (a, Queue a)
88 | Just (v,Q f b) => Just (v, Q (v::f) b)
93 | (++) : Queue a -> Queue a -> Queue a
94 | Q f1 b1 ++ Q f2 b2 = Q (f1 ++ (b1 <>> f2)) b2
98 | length : Queue a -> Nat
99 | length (Q f b) = length f + length b
104 | filter : (a -> Bool) -> Queue a -> Queue a
105 | filter f (Q front back) = Q (filter f front) (filter f back)
110 | mapMaybe : (a -> Maybe b) -> Queue a -> Queue b
111 | mapMaybe f (Q front back) = Q (mapMaybe f front) (mapMaybe f back)
117 | %runElab derive "Queue" [Show,Eq]
120 | Semigroup (Queue a) where
124 | Monoid (Queue a) where
128 | Functor Queue where
129 | map f (Q front back) = Q (map f front) (map f back)
132 | Foldable Queue where
133 | toList (Q f b) = b <>> f
134 | foldr f acc = foldr f acc . toSnocList
135 | foldl f acc = foldl f acc . toList
136 | foldMap f = foldMap f . toList
137 | foldlM f acc = foldlM f acc . toList
138 | null (Q f b) = null f || null b
141 | Traversable Queue where
142 | traverse f (Q front back) = [| Q (traverse f front) (traverse f back) |]