/
DList.hs
41 lines (28 loc) · 916 Bytes
/
DList.hs
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 DList ( DList, fromList, toList, empty, append, cons, dfoldr ) where
import Data.Monoid
newtype DList a = DL { unDL :: [a] -> [a] }
append :: DList a -> DList a -> DList a
-- append xs ys = DL (unDL xs . unDL ys)
append (DL fx) (DL fy) = DL (fx . fy)
fromList :: [a] -> DList a
fromList xs = DL (xs ++)
toList :: DList a -> [a]
-- toList (DL xs) = xs []
toList xs = unDL xs []
empty :: DList a
empty = DL id
cons :: a -> DList a -> DList a
cons x (DL xs) = DL ((x:) . xs)
infixr `cons`
dfoldr :: (a -> b -> b) -> b -> DList a -> b
dfoldr f z xs = foldr f z (toList xs)
safeHead :: DList a -> Maybe a
safeHead xs = case toList xs of
(y:_) -> Just y
_ -> Nothing
dmap :: (a -> b) -> DList a -> DList b
dmap f = dfoldr (\x -> \xs -> cons (f x) xs) empty
instance Functor DList where fmap = dmap
instance Monoid (DList a) where
mempty = empty
mappend = append