{-# LANGUAGE TypeSynonymInstances  #-}

module Data.GenericString where

import Data.String
import Data.Word (Word8)
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as LS
import Safe (readMay)

class (IsString t) => Str t where
    readToMaybeStr :: Read b => t -> Maybe b
    showToStr      :: Show b => b -> t
    appendStr      :: t -> t -> t
    foldrStr       :: (Char -> b -> b) -> b -> t -> b
    strToString    :: t -> String

instance Str String where
    readToMaybeStr = readMay
    showToStr      = show
    appendStr      = (++)
    foldrStr       = foldr
    strToString    = id

instance Str BS.ByteString where
    readToMaybeStr = readMay . BS.unpack
    showToStr      = BS.pack . show
    appendStr      = BS.append
    foldrStr       = BS.foldr
    strToString    = BS.unpack

instance Str LS.ByteString where
    readToMaybeStr = readMay . LS.unpack
    showToStr      = LS.pack . show
    appendStr      = LS.append
    foldrStr       = LS.foldr
    strToString    = LS.unpack