{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}

module Web.SocketIO.Types.String (
        S.IsString(..)
    ,   IsByteString(..)
    ,   IsLazyByteString(..)
    ,   IsText(..)
    ,   Text
    ,   (<>)
    ) where

--------------------------------------------------------------------------------
import qualified    Data.String                             as S
import qualified    Data.Text.Lazy                          as TL
import qualified    Data.ByteString                         as B
import qualified    Data.ByteString.Lazy                    as BL
import qualified    Data.ByteString.Char8                   as C
import              Data.Monoid                             ((<>))

--------------------------------------------------------------------------------
type Text = TL.Text

--------------------------------------------------------------------------------
class IsByteString a where
    fromByteString :: B.ByteString -> a

--------------------------------------------------------------------------------
instance IsByteString String where
    fromByteString = C.unpack

--------------------------------------------------------------------------------
instance IsByteString TL.Text where
    fromByteString = TL.pack . fromByteString

--------------------------------------------------------------------------------
instance IsByteString BL.ByteString where
    fromByteString = BL.fromStrict

--------------------------------------------------------------------------------
class IsLazyByteString a where
    fromLazyByteString :: BL.ByteString -> a

--------------------------------------------------------------------------------
instance IsLazyByteString String where
    fromLazyByteString = fromByteString . BL.toStrict

--------------------------------------------------------------------------------
instance IsLazyByteString TL.Text where
    fromLazyByteString = fromByteString . BL.toStrict

--------------------------------------------------------------------------------
instance IsLazyByteString B.ByteString where
    fromLazyByteString = BL.toStrict

--------------------------------------------------------------------------------
class IsText a where
    fromText :: TL.Text -> a

--------------------------------------------------------------------------------
instance IsText String where
    fromText = TL.unpack

--------------------------------------------------------------------------------
instance IsText B.ByteString where
    fromText = C.pack . fromText

--------------------------------------------------------------------------------
instance IsText BL.ByteString where
    fromText = BL.fromStrict . C.pack . fromText