module Data.DString
( DString
, fromDList
, toDList
, toString
, fromShowS
, toShowS
, empty
, singleton
, cons
, snoc
, append
, concat
, list
, head
, tail
, unfoldr
, foldr
)
where
import Prelude hiding (concat, foldr, head, tail)
import qualified Data.DList as D
import Data.Monoid
import Data.String
newtype DString = DS { toDList :: D.DList Char
}
fromDList :: D.DList Char -> DString
fromDList = DS
instance Monoid DString where
mempty = empty
mappend = append
instance IsString DString where
fromString = fromDList . D.fromList
toString :: DString -> String
toString = D.toList . toDList
fromShowS :: ShowS -> DString
fromShowS = fromDList . D.DL
toShowS :: DString -> ShowS
toShowS = D.unDL . toDList
empty :: DString
empty = fromDList D.empty
singleton :: Char -> DString
singleton = fromDList . D.singleton
cons :: Char -> DString -> DString
cons c ds = fromDList $ D.cons c (toDList ds)
snoc :: DString -> Char -> DString
snoc ds c = fromDList $ D.snoc (toDList ds) c
append :: DString -> DString -> DString
x `append` y = fromDList (toDList x `D.append` toDList y)
concat :: [DString] -> DString
concat = fromDList . D.concat . map toDList
list :: b -> (Char -> DString -> b) -> DString -> b
list nill consit ds =
case toString ds of
[] -> nill
x : xs -> consit x $ fromString xs
head :: DString -> Char
head = list (error "Data.DString.head: empty list") const
tail :: DString -> DString
tail = list (error "Data.DString.tail: empty list") (flip const)
unfoldr :: (b -> Maybe (Char, b)) -> b -> DString
unfoldr pf b = fromDList $ D.unfoldr pf b
foldr :: (Char -> b -> b) -> b -> DString -> b
foldr f b = D.foldr f b . toDList