-- |
-- Module      : Data.Endian
-- Description : Newtypes for little- and big-endian values
-- Copyright   : (c) Aleksey Makarov, 2021
-- License     : BSD 3-Clause License
-- Maintainer  : aleksey.makarov@gmail.com
-- Stability   : experimental
-- Portability : portable
--
-- Newtypes for little- and big-endian instances of `Binary`

{-# LANGUAGE FlexibleInstances #-}

module Data.Endian (Be(..), Le(..)) where

import Data.Binary.Put
import Data.Binary.Get
import Data.Binary

-- | @Be a@ is an instance of `Binary` such that @a@ is serialized as big-endian
newtype Be a = Be { forall a. Be a -> a
fromBe :: a } deriving Be a -> Be a -> Bool
forall a. Eq a => Be a -> Be a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Be a -> Be a -> Bool
$c/= :: forall a. Eq a => Be a -> Be a -> Bool
== :: Be a -> Be a -> Bool
$c== :: forall a. Eq a => Be a -> Be a -> Bool
Eq

-- | @Le a@ is an instance of `Binary` such that @a@ is serialized as little-endian
newtype Le a = Le { forall a. Le a -> a
fromLe :: a } deriving Le a -> Le a -> Bool
forall a. Eq a => Le a -> Le a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Le a -> Le a -> Bool
$c/= :: forall a. Eq a => Le a -> Le a -> Bool
== :: Le a -> Le a -> Bool
$c== :: forall a. Eq a => Le a -> Le a -> Bool
Eq

instance Binary (Be Word16) where
    put :: Be Word16 -> Put
put = Word16 -> Put
putWord16be forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Be a -> a
fromBe
    get :: Get (Be Word16)
get = forall a. a -> Be a
Be forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word16
getWord16be

instance Binary (Le Word16) where
    put :: Le Word16 -> Put
put = Word16 -> Put
putWord16le forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Le a -> a
fromLe
    get :: Get (Le Word16)
get = forall a. a -> Le a
Le forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word16
getWord16le

instance Binary (Be Word32) where
    put :: Be Word32 -> Put
put = Word32 -> Put
putWord32be forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Be a -> a
fromBe
    get :: Get (Be Word32)
get = forall a. a -> Be a
Be forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word32
getWord32be

instance Binary (Le Word32) where
    put :: Le Word32 -> Put
put = Word32 -> Put
putWord32le forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Le a -> a
fromLe
    get :: Get (Le Word32)
get = forall a. a -> Le a
Le forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word32
getWord32le

instance Binary (Be Word64) where
    put :: Be Word64 -> Put
put = Word64 -> Put
putWord64be forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Be a -> a
fromBe
    get :: Get (Be Word64)
get = forall a. a -> Be a
Be forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word64
getWord64be

instance Binary (Le Word64) where
    put :: Le Word64 -> Put
put = Word64 -> Put
putWord64le forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Le a -> a
fromLe
    get :: Get (Le Word64)
get = forall a. a -> Le a
Le forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word64
getWord64le