module GHC.Data.SizedSeq
  ( SizedSeq(..)
  , emptySS
  , addToSS
  , ssElts
  , sizeSS
  ) where

import Prelude -- See note [Why do we import Prelude here?]

data SizedSeq a = SizedSeq {-# UNPACK #-} !Word [a]

emptySS :: SizedSeq a
emptySS :: forall a. SizedSeq a
emptySS = Word -> [a] -> SizedSeq a
forall a. Word -> [a] -> SizedSeq a
SizedSeq Word
0 []

addToSS :: SizedSeq a -> a -> SizedSeq a
addToSS :: forall a. SizedSeq a -> a -> SizedSeq a
addToSS (SizedSeq Word
n [a]
r_xs) a
x = Word -> [a] -> SizedSeq a
forall a. Word -> [a] -> SizedSeq a
SizedSeq (Word
nWord -> Word -> Word
forall a. Num a => a -> a -> a
+Word
1) (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
r_xs)

ssElts :: SizedSeq a -> [a]
ssElts :: forall a. SizedSeq a -> [a]
ssElts (SizedSeq Word
_ [a]
r_xs) = [a] -> [a]
forall a. [a] -> [a]
reverse [a]
r_xs

sizeSS :: SizedSeq a -> Word
sizeSS :: forall a. SizedSeq a -> Word
sizeSS (SizedSeq Word
n [a]
_) = Word
n