{-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE FlexibleInstances #-} module Data.Text.IsText where import Data.String import qualified Data.ByteString as SB import qualified Data.ByteString.Lazy as LB import qualified Codec.Binary.UTF8.String as UTF8 import qualified Data.Text as T {- | Type class for data structures that are logically text -} class IsString a => IsText a where toString :: a -> String instance IsText String where toString = id {- | The UTF-8 encoding is assumed for ByteStrings -} instance IsText SB.ByteString where toString = UTF8.decode . SB.unpack {- | The UTF-8 encoding is assumed for ByteStrings -} instance IsText LB.ByteString where toString = UTF8.decode . LB.unpack instance IsText T.Text where toString = T.unpack {- | Converts between instances of IsText -} fromText :: (IsText a, IsText b) => a -> b fromText = fromString . toString