{-# LANGUAGE NoMonomorphismRestriction#-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TypeSynonymInstances #-}

module Bamboo.Helper.ByteString where

import Bamboo.Helper.PreludeEnv
import Data.Char (toLower)
import Data.Default
import qualified Data.ByteString as SB
import qualified Data.ByteString.Char8 as S
import qualified Data.ByteString.Char8 as S
import qualified Data.ByteString.Lazy as LB
import qualified Data.ByteString.Lazy.UTF8 as LU
import qualified Data.ByteString.UTF8 as SU
import qualified Prelude as P


class SB a where
    to_sb :: a -> SB.ByteString

instance SB SB.ByteString where
    to_sb = P.id

instance SB LB.ByteString where
    to_sb = LB.toChunks > SB.concat

instance SB String where
    to_sb = SU.fromString

class LB a where
    to_lb :: a -> LB.ByteString

instance LB LB.ByteString where
    to_lb = P.id

instance LB SB.ByteString where
    to_lb = return > LB.fromChunks

instance LB String where
    to_lb = LU.fromString

class US a where
  to_us :: a -> String

instance US String where
  to_us = P.id

instance US LB.ByteString where
  to_us = LU.toString

instance US SB.ByteString where
  to_us = SU.toString

lower :: S.ByteString -> S.ByteString
lower = S.map toLower

read_bytestring :: String -> IO S.ByteString
read_bytestring = u2b > S.readFile

instance Default S.ByteString where
  def = S.empty