-- | This module is for providing functions that accept generic strings. -- -- Functions should be declared like: -- @ -- foo :: StringLike t => t -> Foobar -- @. -- -- Internally the functions can use 'stringConv' to convert strings -- to a preferred form. Byte based representations are utf8-encoded. module Data.StringLike where import Codec.Binary.UTF8.Generic as C import qualified Data.ByteString as B import qualified Data.ByteString.UTF8 as BU import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy.UTF8 as LU import Data.Word(Word8) -- | Convert a string to an another type. class StringConv a b where stringConv :: a -> b instance StringConv String String where stringConv = id instance StringConv B.ByteString B.ByteString where stringConv = id instance StringConv L.ByteString L.ByteString where stringConv = id instance StringConv [Word8] [Word8] where stringConv = id instance StringConv String B.ByteString where stringConv = BU.fromString instance StringConv String L.ByteString where stringConv = LU.fromString instance StringConv String [Word8] where stringConv = C.fromString instance StringConv B.ByteString String where stringConv = BU.toString instance StringConv B.ByteString L.ByteString where stringConv = L.fromChunks . (:[]) instance StringConv B.ByteString [Word8] where stringConv = B.unpack instance StringConv L.ByteString String where stringConv = LU.toString instance StringConv L.ByteString B.ByteString where stringConv = B.concat . L.toChunks instance StringConv L.ByteString [Word8] where stringConv = L.unpack instance StringConv [Word8] String where stringConv = C.toString instance StringConv [Word8] B.ByteString where stringConv = B.pack instance StringConv [Word8] L.ByteString where stringConv = L.pack -- | A type class for string like things. class (StringConv t String, StringConv t B.ByteString, StringConv t L.ByteString, StringConv t [Word8], StringConv String t, StringConv B.ByteString t, StringConv L.ByteString t, StringConv [Word8] t) => StringLike t where instance StringLike String instance StringLike B.ByteString instance StringLike L.ByteString instance StringLike [Word8]