{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE Safe                 #-}
{-# LANGUAGE TypeSynonymInstances #-}
module Data.String.Transform where

import qualified Data.ByteString           as B
import qualified Data.ByteString.Lazy      as BL
import qualified Data.ByteString.Lazy.UTF8 as BLU
import qualified Data.ByteString.UTF8      as BU
import qualified Data.Text                 as T
import qualified Data.Text.Encoding        as T
import qualified Data.Text.Lazy            as TL
import qualified Data.Text.Lazy.Encoding   as TL

class ToString a where
    toString :: a -> String

instance ToString String where
    toString = id

instance ToString B.ByteString where
    toString = BU.toString

instance ToString BL.ByteString where
    toString = BLU.toString

instance ToString T.Text where
    toString = T.unpack

instance ToString TL.Text where
    toString = TL.unpack

class ToByteStringStrict a where
    toByteStringStrict :: a -> B.ByteString

instance ToByteStringStrict String where
    toByteStringStrict = BU.fromString

instance ToByteStringStrict B.ByteString where
    toByteStringStrict = id

instance ToByteStringStrict BL.ByteString where
    toByteStringStrict = BL.toStrict

instance ToByteStringStrict T.Text where
    toByteStringStrict = T.encodeUtf8

instance ToByteStringStrict TL.Text where
    toByteStringStrict = T.encodeUtf8 . TL.toStrict

class ToByteStringLazy a where
    toByteStringLazy :: a -> BL.ByteString

instance ToByteStringLazy String where
    toByteStringLazy = BLU.fromString

instance ToByteStringLazy B.ByteString where
    toByteStringLazy = BL.fromStrict

instance ToByteStringLazy BL.ByteString where
    toByteStringLazy = id

instance ToByteStringLazy T.Text where
    toByteStringLazy = BL.fromStrict . T.encodeUtf8

instance ToByteStringLazy TL.Text where
    toByteStringLazy = TL.encodeUtf8

class ToTextStrict a where
    toTextStrict :: a -> T.Text

instance ToTextStrict String where
    toTextStrict = T.pack

instance ToTextStrict B.ByteString where
    toTextStrict = T.decodeUtf8

instance ToTextStrict BL.ByteString where
    toTextStrict = T.decodeUtf8 . BL.toStrict

instance ToTextStrict T.Text where
    toTextStrict = id

instance ToTextStrict TL.Text where
    toTextStrict = TL.toStrict

class ToTextLazy a where
    toTextLazy :: a -> TL.Text

instance ToTextLazy String where
    toTextLazy = TL.pack

instance ToTextLazy B.ByteString where
    toTextLazy = TL.decodeUtf8 . BL.fromStrict

instance ToTextLazy BL.ByteString where
    toTextLazy = TL.decodeUtf8

instance ToTextLazy T.Text where
    toTextLazy = TL.fromStrict

instance ToTextLazy TL.Text where
    toTextLazy = id