Stability | experimental |
---|---|
Maintainer | Bas van Dijk <v.dijk.bas@gmail.com> |
Difference strings: a data structure for O(1) append on strings. Note that a DString is just a newtype wrapper around a 'DList Char'. The reason we need a new type instead of just a type synonym is that we can have an 'instance IsString DString' without using language extensions (TypeSynonymInstances or FlexibleInstances) so we can write overloaded string literals of type DString.
- data DString
- fromDList :: DList Char -> DString
- toDList :: DString -> DList Char
- fromShowS :: ShowS -> DString
- toShowS :: DString -> ShowS
- singleton :: Char -> DString
- cons :: Char -> DString -> DString
- snoc :: DString -> Char -> DString
- concat :: [DString] -> DString
- list :: b -> (Char -> DString -> b) -> DString -> b
- head :: DString -> Char
- tail :: DString -> DString
- unfoldr :: (b -> Maybe (Char, b)) -> b -> DString
- foldr :: (Char -> b -> b) -> b -> DString -> b
Documentation
A difference string is a function that given a string, returns the original contents of the difference string prepended at the given string.
This structure supports O(1) append
en snoc
operations on
strings making it very usefull for append-heavy uses such as
logging and pretty printing.
You can use it to efficiently show a tree for example: (Note that we make use of some functions from the string-combinators package: http://hackage.haskell.org/cgi-bin/hackage-scripts/package/string-combinators)
{-# LANGUAGE OverloadedStrings #-} import Data.DString import Data.String.Combinators ((<+>), fromShow, paren) data Tree a = Leaf a | Branch (Tree a) (Tree a) instance Show a => Show (Tree a) where show = toString . go where go (Leaf x) = "Leaf" <+> fromShow x go (Branch l r) = "Branch" <+> paren (go l) <+> paren (go r)