module Dahdit.Binary
  ( Binary (..)
  , byteSizeViaPut
  )
where

import Dahdit.Free (Get, Put)
import Dahdit.Funs
  ( getFloatBE
  , getFloatLE
  , getInt16BE
  , getInt16LE
  , getInt24BE
  , getInt24LE
  , getInt32BE
  , getInt32LE
  , getInt8
  , getWord16BE
  , getWord16LE
  , getWord24BE
  , getWord24LE
  , getWord32BE
  , getWord32LE
  , getWord8
  , putFloatBE
  , putFloatLE
  , putInt16BE
  , putInt16LE
  , putInt24BE
  , putInt24LE
  , putInt32BE
  , putInt32LE
  , putInt8
  , putWord16BE
  , putWord16LE
  , putWord24BE
  , putWord24LE
  , putWord32BE
  , putWord32LE
  , putWord8
  )
import Dahdit.Nums
  ( FloatBE (..)
  , FloatLE
  , Int16BE (..)
  , Int16LE
  , Int24BE (..)
  , Int24LE
  , Int32BE (..)
  , Int32LE
  , Word16BE (..)
  , Word16LE
  , Word24BE (..)
  , Word24LE
  , Word32BE (..)
  , Word32LE
  )
import Dahdit.Run (runCount)
import Dahdit.Sizes (ByteCount, ByteSized)
import Data.Int (Int8)
import Data.Word (Word8)

class ByteSized a => Binary a where
  get :: Get a
  put :: a -> Put

byteSizeViaPut :: Binary a => a -> ByteCount
byteSizeViaPut :: forall a. Binary a => a -> ByteCount
byteSizeViaPut = Put -> ByteCount
runCount forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Binary a => a -> Put
put

instance Binary () where
  get :: Get ()
get = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
  put :: () -> Put
put ()
_ = forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

instance Binary Word8 where
  get :: Get Word8
get = Get Word8
getWord8
  put :: Word8 -> Put
put = Word8 -> Put
putWord8

instance Binary Int8 where
  get :: Get Int8
get = Get Int8
getInt8
  put :: Int8 -> Put
put = Int8 -> Put
putInt8

instance Binary Word16LE where
  get :: Get Word16LE
get = Get Word16LE
getWord16LE
  put :: Word16LE -> Put
put = Word16LE -> Put
putWord16LE

instance Binary Int16LE where
  get :: Get Int16LE
get = Get Int16LE
getInt16LE
  put :: Int16LE -> Put
put = Int16LE -> Put
putInt16LE

instance Binary Word24LE where
  get :: Get Word24LE
get = Get Word24LE
getWord24LE
  put :: Word24LE -> Put
put = Word24LE -> Put
putWord24LE

instance Binary Int24LE where
  get :: Get Int24LE
get = Get Int24LE
getInt24LE
  put :: Int24LE -> Put
put = Int24LE -> Put
putInt24LE

instance Binary Word32LE where
  get :: Get Word32LE
get = Get Word32LE
getWord32LE
  put :: Word32LE -> Put
put = Word32LE -> Put
putWord32LE

instance Binary Int32LE where
  get :: Get Int32LE
get = Get Int32LE
getInt32LE
  put :: Int32LE -> Put
put = Int32LE -> Put
putInt32LE

instance Binary FloatLE where
  get :: Get FloatLE
get = Get FloatLE
getFloatLE
  put :: FloatLE -> Put
put = FloatLE -> Put
putFloatLE

instance Binary Word16BE where
  get :: Get Word16BE
get = Get Word16BE
getWord16BE
  put :: Word16BE -> Put
put = Word16BE -> Put
putWord16BE

instance Binary Int16BE where
  get :: Get Int16BE
get = Get Int16BE
getInt16BE
  put :: Int16BE -> Put
put = Int16BE -> Put
putInt16BE

instance Binary Word24BE where
  get :: Get Word24BE
get = Get Word24BE
getWord24BE
  put :: Word24BE -> Put
put = Word24BE -> Put
putWord24BE

instance Binary Int24BE where
  get :: Get Int24BE
get = Get Int24BE
getInt24BE
  put :: Int24BE -> Put
put = Int24BE -> Put
putInt24BE

instance Binary Word32BE where
  get :: Get Word32BE
get = Get Word32BE
getWord32BE
  put :: Word32BE -> Put
put = Word32BE -> Put
putWord32BE

instance Binary Int32BE where
  get :: Get Int32BE
get = Get Int32BE
getInt32BE
  put :: Int32BE -> Put
put = Int32BE -> Put
putInt32BE

instance Binary FloatBE where
  get :: Get FloatBE
get = Get FloatBE
getFloatBE
  put :: FloatBE -> Put
put = FloatBE -> Put
putFloatBE