{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} -- | /WARNING/: This module is /not/ intended for use outside the TagSoup library. -- -- This module provides an abstraction for String's as used inside TagSoup. It allows -- TagSoup to work with String (list of Char), ByteString.Char8, ByteString.Lazy.Char8, -- Data.Text and Data.Text.Lazy. module Text.StringLike where import Data.Typeable import qualified Data.ByteString.Char8 as BS import qualified Data.ByteString.Lazy.Char8 as LBS import qualified Data.Text as T import qualified Data.Text.Lazy as LT -- | A class to generalise TagSoup parsing over many types of string-like types. -- Examples are given for the String type. class (Typeable a, Eq a) => StringLike a where -- | > empty = "" empty :: a -- | > cons = (:) cons :: Char -> a -> a -- | > uncons [] = Nothing -- > uncons (x:xs) = Just (x, xs) uncons :: a -> Maybe (Char, a) -- | > toString = id toString :: a -> String -- | > fromString = id fromString :: String -> a -- | > fromChar = return fromChar :: Char -> a -- | > strConcat = concat strConcat :: [a] -> a -- | > strNull = null strNull :: a -> Bool -- | > append = (++) append :: a -> a -> a -- | Convert a String from one type to another. castString :: (StringLike a, StringLike b) => a -> b castString = fromString . toString instance StringLike String where uncons [] = Nothing uncons (x:xs) = Just (x, xs) toString = id fromString = id fromChar = (:[]) strConcat = concat empty = [] strNull = null cons c = (c:) append = (++) instance StringLike BS.ByteString where uncons = BS.uncons toString = BS.unpack fromString = BS.pack fromChar = BS.singleton strConcat = BS.concat empty = BS.empty strNull = BS.null cons = BS.cons append = BS.append instance StringLike LBS.ByteString where uncons = LBS.uncons toString = LBS.unpack fromString = LBS.pack fromChar = LBS.singleton strConcat = LBS.concat empty = LBS.empty strNull = LBS.null cons = LBS.cons append = LBS.append instance StringLike T.Text where uncons = T.uncons toString = T.unpack fromString = T.pack fromChar = T.singleton strConcat = T.concat empty = T.empty strNull = T.null cons = T.cons append = T.append instance StringLike LT.Text where uncons = LT.uncons toString = LT.unpack fromString = LT.pack fromChar = LT.singleton strConcat = LT.concat empty = LT.empty strNull = LT.null cons = LT.cons append = LT.append