{-# LANGUAGE CPP #-}
module DList where

import           Prelude ()
import           Test.Hspec.Core.Compat

newtype DList a = DList ([a] -> [a])

instance Monoid (DList a) where
  mempty :: DList a
mempty = ([a] -> [a]) -> DList a
forall a. ([a] -> [a]) -> DList a
DList [a] -> [a]
forall a. a -> a
id
#if MIN_VERSION_base(4,11,0)
instance Semigroup (DList a) where
#endif
  DList [a] -> [a]
f
#if MIN_VERSION_base(4,11,0)
    <> :: DList a -> DList a -> DList a
<>
#else
    `mappend`
#endif
    DList [a] -> [a]
g = ([a] -> [a]) -> DList a
forall a. ([a] -> [a]) -> DList a
DList ([a] -> [a]
f ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
g)

singleton :: a -> DList a
singleton :: forall a. a -> DList a
singleton a
x = ([a] -> [a]) -> DList a
forall a. ([a] -> [a]) -> DList a
DList (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
:)

fromList :: [a] -> DList a
fromList :: forall a. [a] -> DList a
fromList [a]
xs = ([a] -> [a]) -> DList a
forall a. ([a] -> [a]) -> DList a
DList ([a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++)

toList :: DList a -> [a]
toList :: forall a. DList a -> [a]
toList (DList [a] -> [a]
f) = [a] -> [a]
f []