Cabal-syntax-3.12.0.0: src/Distribution/Compat/DList.hs
-----------------------------------------------------------------------------
-- |
-- Module : Distribution.Compat.DList
-- Copyright : (c) Ben Gamari 2015-2019
-- License : BSD3
--
-- Maintainer : cabal-dev@haskell.org
-- Stability : experimental
-- Portability : portable
--
-- A very simple difference list.
module Distribution.Compat.DList
( DList
, runDList
, empty
, singleton
, fromList
, toList
, snoc
) where
import Distribution.Compat.Prelude hiding (empty, toList)
import Prelude ()
-- | Difference list.
newtype DList a = DList ([a] -> [a])
runDList :: DList a -> [a]
runDList (DList run) = run []
-- | Make 'DList' containing single element.
singleton :: a -> DList a
singleton a = DList (a :)
-- | @since 3.4.0.0
empty :: DList a
empty = DList id
fromList :: [a] -> DList a
fromList as = DList (as ++)
toList :: DList a -> [a]
toList = runDList
snoc :: DList a -> a -> DList a
snoc xs x = xs <> singleton x
instance Monoid (DList a) where
mempty = empty
mappend = (<>)
instance Semigroup (DList a) where
DList a <> DList b = DList (a . b)