module Data.DList ( DList(..) , empty , singleton , toList , cons , snoc , append ) where newtype DList a = DL { unDL :: [a] -> [a] } empty :: DList a empty = DL ([] ++) {-# INLINE empty #-} singleton :: a -> DList a singleton x = DL ([x] ++) {-# INLINE singleton #-} toList :: DList a -> [a] toList xsf = unDL xsf [] {-# INLINE toList #-} -- Prepend a single element to a dlist. infixr `cons` cons :: a -> DList a -> DList a cons x xs = DL ((x:) . unDL xs) {-# INLINE cons #-} -- Append a single element to a dlist. infixl `snoc` snoc :: DList a -> a -> DList a snoc xs x = append xs $ singleton x {-# INLINE snoc #-} -- Append dlists. append :: DList a -> DList a -> DList a append xsf ysf = DL $ (unDL xsf) . (unDL ysf) {-# INLINE append #-}