23 lines
604 B
Haskell
23 lines
604 B
Haskell
module Queue1 where
|
|
|
|
import StrictList as L
|
|
|
|
data Queue a = Q { left :: StrictList a
|
|
, leftLen :: !Int
|
|
, right :: StrictList a
|
|
, rightLen :: !Int
|
|
} deriving (Show, Eq)
|
|
|
|
empty :: Queue a
|
|
empty = Q Empty 0 Empty 0
|
|
|
|
length :: Queue a -> Int
|
|
length (Q _ ll _ rl) = ll + rl
|
|
|
|
insert :: a -> Queue a -> Queue a
|
|
insert e (Q l ll r rl) = Q l ll (e :$ r) (rl + 1)
|
|
|
|
remove :: Queue a -> (a, Queue a)
|
|
remove (Q Empty _ r rl) = remove (Q (L.reverse r) rl Empty 0)
|
|
remove (Q l ll r rl) = (L.head l, Q (L.tail l) (ll - 1) r rl)
|