aboutsummaryrefslogtreecommitdiff
path: root/Haskell-book/28/DifferenceList/src/Data/DList.hs
blob: 12d3a53041e4cf0b91d7c8c7b7c39191080b4848 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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 #-}