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)