1 | module Data.BoundedQueue.Unsized
3 | import Data.BoundedQueue.Unsized.Internal
5 | import Data.Seq.Unsized
6 | import Derive.Prelude
8 | %language ElabReflection
17 | MkBoundedQueue empty
23 | null : BoundedQueue a
25 | null (MkBoundedQueue _ _ 0) =
38 | in MkBoundedQueue (fromList vs')
49 | let sv' = take n $
cast sv
50 | in MkBoundedQueue (fromList sv')
57 | toList : BoundedQueue a
59 | toList (MkBoundedQueue queue _ _) =
65 | toSnocList : BoundedQueue a
67 | toSnocList (MkBoundedQueue queue _ _) =
72 | enqueue : BoundedQueue a
75 | enqueue (MkBoundedQueue queue queuelimit queuesize) v =
76 | case queuelimit == queuesize of
80 | MkBoundedQueue queue
84 | MkBoundedQueue (queue' `snoc` v)
88 | MkBoundedQueue (queue `snoc` v)
90 | (queuesize `plus` 1)
94 | dequeue : BoundedQueue a
95 | -> Maybe (a, BoundedQueue a)
96 | dequeue (MkBoundedQueue queue queuelimit queuesize) =
100 | Just (h, queue') =>
101 | Just (h, MkBoundedQueue queue'
103 | (queuesize `minus` 1)
116 | prepend x (MkBoundedQueue queue queuelimit queuesize) =
117 | case queuelimit == queuesize of
119 | case viewl queue of
121 | MkBoundedQueue queue
124 | Just (_, queue') =>
125 | MkBoundedQueue (x `cons` queue')
129 | MkBoundedQueue (x `cons` queue)
131 | (queuesize `plus` 1)
141 | peekOldest : BoundedQueue a
142 | -> Maybe (a, BoundedQueue a)
145 | Just (v, MkBoundedQueue queue
149 | Just (v, MkBoundedQueue (v `cons` queue)
151 | (queuesize `plus` 1)
158 | (++) : BoundedQueue a
161 | (MkBoundedQueue queue1 queuelimit1 queuesize1) ++ (MkBoundedQueue queue2 queuelimit2 queuesize2) =
162 | MkBoundedQueue (queue1 ++ queue2)
163 | (queuelimit1 `plus` queuelimit2)
164 | (queuesize1 `plus` queuesize2)
168 | length : BoundedQueue a
170 | length (MkBoundedQueue _ _ queuesize) =
178 | Semigroup (BoundedQueue a) where
182 | Monoid (BoundedQueue a) where
186 | Functor BoundedQueue where
187 | map f (MkBoundedQueue queue queuelimit queuesize) =
188 | MkBoundedQueue (map f queue)