func-data-presn/Queue1.hs

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)