Portability | portable (Haskell 98) |
---|---|
Stability | experimental |
Maintainer | dons@cse.unsw.edu.au |
Safe Haskell | Safe-Infered |
Difference lists: a data structure for O(1) append on lists.
- newtype DList a = DL {
- unDL :: [a] -> [a]
- fromList :: [a] -> DList a
- toList :: DList a -> [a]
- empty :: DList a
- singleton :: a -> DList a
- cons :: a -> DList a -> DList a
- snoc :: DList a -> a -> DList a
- append :: DList a -> DList a -> DList a
- concat :: [DList a] -> DList a
- replicate :: Int -> a -> DList a
- list :: b -> (a -> DList a -> b) -> DList a -> b
- head :: DList a -> a
- tail :: DList a -> DList a
- unfoldr :: (b -> Maybe (a, b)) -> b -> DList a
- foldr :: (a -> b -> b) -> b -> DList a -> b
- map :: (a -> b) -> DList a -> DList b
- maybeReturn :: MonadPlus m => Maybe a -> m a
Documentation
A difference list is a function that given a list, returns the original contents of the difference list prepended at the given list
This structure supports O(1) append and snoc operations on lists, making it very useful for append-heavy uses, such as logging and pretty printing.
For example, using DList as the state type when printing a tree with the Writer monad
import Control.Monad.Writer import Data.DList data Tree a = Leaf a | Branch (Tree a) (Tree a) flatten_writer :: Tree x -> DList x flatten_writer = snd . runWriter . flatten where flatten (Leaf x) = tell (singleton x) flatten (Branch x y) = flatten x >> flatten y
Construction
Basic functions
replicate :: Int -> a -> DList aSource
O(n), Create a difference list of the given number of elements
MonadPlus
maybeReturn :: MonadPlus m => Maybe a -> m aSource