module Data.ByteString.Lazy.Internal.Deque (
Deque (..),
empty,
null,
cons,
snoc,
popFront,
popRear,
) where
import qualified Data.ByteString as S
import Data.Int (Int64)
import Prelude hiding (head, length, null)
data Deque = Deque
{ front :: [S.ByteString]
, rear :: [S.ByteString]
,
byteLength :: !Int64
}
empty :: Deque
empty = Deque [] [] 0
null :: Deque -> Bool
null deque = byteLength deque == 0
cons :: S.ByteString -> Deque -> Deque
cons x (Deque fs rs acc) = Deque (x : fs) rs (acc + len x)
snoc :: S.ByteString -> Deque -> Deque
snoc x (Deque fs rs acc) = Deque fs (x : rs) (acc + len x)
len :: S.ByteString -> Int64
len x = fromIntegral $ S.length x
popFront :: Deque -> Maybe (S.ByteString, Deque)
popFront (Deque [] rs acc) = case reverse rs of
[] -> Nothing
x : xs -> Just (x, Deque xs [] (acc len x))
popFront (Deque (x : xs) rs acc) = Just (x, Deque xs rs (acc len x))
popRear :: Deque -> Maybe (Deque, S.ByteString)
popRear (Deque fs [] acc) = case reverse fs of
[] -> Nothing
x : xs -> Just (Deque [] xs (acc len x), x)
popRear (Deque fs (x : xs) acc) = Just (Deque fs xs (acc len x), x)