{-# LANGUAGE FlexibleInstances,TypeSynonymInstances #-}
-- | A type-class to provide coding operations to different data types
--   using the same function names.
module Sound.OpenSoundControl.Coding (Coding(..) ) where

import qualified Data.ByteString as S
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.Lazy.Char8 as C
import           Sound.OpenSoundControl.Type (OSC)
import qualified Sound.OpenSoundControl.Coding.Decode.Binary as Binary
import qualified Sound.OpenSoundControl.Coding.Encode.Builder as Builder

-- | Converting from and to binary packet representations.
class Coding a where
    -- | Decode an OSC packet.
    encodeOSC :: OSC -> a
    -- | Encode an OSC packet.
    decodeOSC :: a -> OSC

instance Coding S.ByteString where
    encodeOSC = Builder.encodeOSC'
    decodeOSC = Binary.decodeOSC'

instance Coding B.ByteString where
    encodeOSC = Builder.encodeOSC
    decodeOSC = Binary.decodeOSC

instance Coding String where
    encodeOSC = C.unpack . encodeOSC
    decodeOSC = decodeOSC . C.pack