----------------------------------------------------------------------------- -- | -- Module : Distribution.Compat.DList -- Copyright : (c) Ben Gamari 2015-2019 -- License : BSD3 -- -- Maintainer : [email protected] -- Stability : experimental -- Portability : portable -- -- A very simple difference list. module Distribution.Compat.DList ( DList, runDList, singleton, snoc, ) where import Prelude () import Distribution.Compat.Prelude -- | Difference list. newtype DList a = DList ([a] -> [a]) runDList :: DList a -> [a] runDList (DList run) = run [] -- | Make 'DList' with containing single element. singleton :: a -> DList a singleton a = DList (a:) snoc :: DList a -> a -> DList a snoc xs x = xs <> singleton x instance Monoid (DList a) where mempty = DList id mappend = (<>) instance Semigroup (DList a) where DList a <> DList b = DList (a . b)