module Util.Internal.StrictList ( List(..) , reverse ) where import Prelude hiding (reverse) -- | A strict list. data List a = Nil | !a `Cons` !(List a) infixr 5 `Cons` instance Functor List where fmap f = go where go Nil = Nil go (x `Cons` xs) = f x `Cons` go xs {-# INLINE fmap #-} instance Foldable List where foldr f acc = go where go Nil = acc go (x `Cons` xs) = f x (go xs) {-# INLINE foldr #-} instance Traversable List where traverse f = go where go Nil = pure Nil go (x `Cons` xs) = Cons <$> f x <*> go xs {-# INLINE traverse #-} reverse :: List a -> List a reverse = rev Nil where rev acc Nil = acc rev acc (t `Cons` ts) = rev (t `Cons` acc) ts {-# INLINE reverse #-}