Skip to content

Commit 5cc36e1

Browse files
committed
Peek and pop return maybes
1 parent 8a18dbe commit 5cc36e1

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

src/Data/Deque/Mutable/Linear.hs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -119,20 +119,21 @@ isFull :: Deque a %1-> (Ur Bool, Deque a)
119119
isFull d =
120120
size d & \(Ur sz, Deque len ptr arr) -> (Ur (len == sz), Deque len ptr arr)
121121

122-
peek :: HasCallStack => Face -> Deque a %1-> (Ur a, Deque a)
123-
peek _ (Deque 0 _ arr) = error "Peeking a zero-length deque." $ arr
122+
peek :: HasCallStack => Face -> Deque a %1-> (Ur (Maybe a), Deque a)
123+
peek _ (Deque 0 p arr) = (Ur Nothing, Deque 0 p arr)
124124
peek face (Deque len ptr@(Ptr p) arr) = case face of
125-
Front -> Array.read arr p & \(val, arr0) -> (val, Deque len ptr arr0)
125+
Front ->
126+
Array.read arr p & \(Ur a, arr0) -> (Ur (Just a), Deque len ptr arr0)
126127
Back -> Array.size arr & \(Ur sz, arr0) ->
127-
Array.read arr0 (backPtr 0 len sz ptr) & \(val, arr1) ->
128-
(val, Deque len ptr arr1)
128+
Array.read arr0 (backPtr 0 len sz ptr) & \(Ur a, arr1) ->
129+
(Ur (Just a), Deque len ptr arr1)
129130

130131
-- | View the top of the left queue
131-
peekFront :: HasCallStack => Deque a %1-> (Ur a, Deque a)
132+
peekFront :: HasCallStack => Deque a %1-> (Ur (Maybe a), Deque a)
132133
peekFront = peek Front
133134

134135
-- | View the top of the right queue
135-
peekBack :: HasCallStack => Deque a %1-> (Ur a, Deque a)
136+
peekBack :: HasCallStack => Deque a %1-> (Ur (Maybe a), Deque a)
136137
peekBack = peek Back
137138

138139

@@ -159,22 +160,22 @@ pushFront = push Front
159160
pushBack :: HasCallStack => a -> Deque a %1-> Deque a
160161
pushBack = push Back
161162

162-
pop :: HasCallStack => Face -> Deque a %1-> (Ur a, Deque a)
163-
pop _ (Deque 0 _ arr) = error "Popping from an empty deque" $ arr
163+
pop :: HasCallStack => Face -> Deque a %1-> (Ur (Maybe a), Deque a)
164+
pop _ (Deque 0 p arr) = (Ur Nothing, Deque 0 p arr)
164165
pop face (Deque len ptr@(Ptr p) arr) = case face of
165166
Front -> Array.size arr & \(Ur sz, arr0) ->
166-
Array.read arr0 p & \(val, arr1) ->
167-
(val, Deque (len-1) (Ptr $ nextPtr sz ptr) arr1)
167+
Array.read arr0 p & \(Ur a, arr1) ->
168+
(Ur (Just a), Deque (len-1) (Ptr $ nextPtr sz ptr) arr1)
168169
Back -> Array.size arr & \(Ur sz, arr0) ->
169-
Array.read arr0 (backPtr 0 len sz ptr) & \(val, arr1) ->
170-
(val, Deque (len-1) ptr arr1)
170+
Array.read arr0 (backPtr 0 len sz ptr) & \(Ur a, arr1) ->
171+
(Ur (Just a), Deque (len-1) ptr arr1)
171172

172173
-- | Remove the last added element from the left queue
173-
popFront :: HasCallStack => Deque a %1-> (Ur a, Deque a)
174+
popFront :: Deque a %1-> (Ur (Maybe a), Deque a)
174175
popFront = pop Front
175176

176177
-- | Remove the last added element from the right queue
177-
popBack :: HasCallStack => Deque a %1-> (Ur a, Deque a)
178+
popBack :: Deque a %1-> (Ur (Maybe a), Deque a)
178179
popBack = pop Back
179180

180181
-- Note: We can't use a Prelude.Functor nor a Data.Functor

0 commit comments

Comments
 (0)