{-# LANGUAGE TypeSynonymInstances #-}
---------------------------------------------------------
--
-- Module        : Data.ByteString.Class
-- Copyright     : Michael Snoyman
-- License       : BSD3
--
-- Maintainer    : Michael Snoyman <michael@snoyman.com>
-- Stability     : Stable
-- Portability   : portable
--
-- Classes for automatic conversion to and from strict and lazy bytestrings.
--
-- Please note: the instance for 'String' uses UTF-8 encoding.
--
---------------------------------------------------------
module Data.ByteString.Class
    ( StrictByteString (..)
    , LazyByteString (..)
    ) where

import qualified Data.ByteString as S
import qualified Data.ByteString.UTF8 as SU
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.UTF8 as LU

class StrictByteString a where
    toStrictByteString :: a -> S.ByteString
    fromStrictByteString :: S.ByteString -> a

instance StrictByteString S.ByteString where
    toStrictByteString = id
    fromStrictByteString = id

instance StrictByteString L.ByteString where
    toStrictByteString = S.concat . L.toChunks
    fromStrictByteString = L.fromChunks . return

instance StrictByteString String where
    toStrictByteString = SU.fromString
    fromStrictByteString = SU.toString

class LazyByteString a where
    toLazyByteString :: a -> L.ByteString
    fromLazyByteString :: L.ByteString -> a

instance LazyByteString L.ByteString where
    toLazyByteString = id
    fromLazyByteString = id

instance LazyByteString S.ByteString where
    toLazyByteString = fromStrictByteString
    fromLazyByteString = toStrictByteString

instance LazyByteString String where
    toLazyByteString = LU.fromString
    fromLazyByteString = LU.toString