-- | "Machine" integers: sized integers & naturals with explicit endianness type
--   tags for serialization.

{-# LANGUAGE CPP #-} -- for host endianness checking
{-# LANGUAGE UndecidableInstances #-} -- for convenient type level arithmetic

module Binrep.Type.Int where

import Binrep.Put.Mason qualified as Mason
import Binrep.Put.Bytezap qualified as Bytezap
import Binrep.Get.Flatparse qualified as Flatparse
import Binrep.BLen.Simple qualified as Simple
import Binrep.CBLen

import Bytezap.Poke.Int qualified as BZ
import FlatParse.Basic qualified as FP

import Binrep.Type.Common ( Endianness(..) )
import Strongweak

import Data.Word
import Data.Int
import Data.Aeson

import GHC.Generics ( Generic )
import Data.Data ( Data )
import GHC.TypeNats

import Binrep.Via ( Binreply(..) )

-- | Machine integer sign.
--
-- Signed integers use two's complement for representation.
data ISign
  = U -- ^ unsigned
  | I -- ^   signed (two's complement)
    deriving stock ((forall x. ISign -> Rep ISign x)
-> (forall x. Rep ISign x -> ISign) -> Generic ISign
forall x. Rep ISign x -> ISign
forall x. ISign -> Rep ISign x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ISign -> Rep ISign x
from :: forall x. ISign -> Rep ISign x
$cto :: forall x. Rep ISign x -> ISign
to :: forall x. Rep ISign x -> ISign
Generic, Typeable ISign
Typeable ISign
-> (forall (c :: Type -> Type).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> ISign -> c ISign)
-> (forall (c :: Type -> Type).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c ISign)
-> (ISign -> Constr)
-> (ISign -> DataType)
-> (forall (t :: Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c ISign))
-> (forall (t :: Type -> Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ISign))
-> ((forall b. Data b => b -> b) -> ISign -> ISign)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ISign -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ISign -> r)
-> (forall u. (forall d. Data d => d -> u) -> ISign -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> ISign -> u)
-> (forall (m :: Type -> Type).
    Monad m =>
    (forall d. Data d => d -> m d) -> ISign -> m ISign)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> ISign -> m ISign)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> ISign -> m ISign)
-> Data ISign
ISign -> Constr
ISign -> DataType
(forall b. Data b => b -> b) -> ISign -> ISign
forall a.
Typeable a
-> (forall (c :: Type -> Type).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: Type -> Type).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: Type -> Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: Type -> Type).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> ISign -> u
forall u. (forall d. Data d => d -> u) -> ISign -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ISign -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ISign -> r
forall (m :: Type -> Type).
Monad m =>
(forall d. Data d => d -> m d) -> ISign -> m ISign
forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ISign -> m ISign
forall (c :: Type -> Type).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ISign
forall (c :: Type -> Type).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ISign -> c ISign
forall (t :: Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ISign)
forall (t :: Type -> Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ISign)
$cgfoldl :: forall (c :: Type -> Type).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ISign -> c ISign
gfoldl :: forall (c :: Type -> Type).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ISign -> c ISign
$cgunfold :: forall (c :: Type -> Type).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ISign
gunfold :: forall (c :: Type -> Type).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ISign
$ctoConstr :: ISign -> Constr
toConstr :: ISign -> Constr
$cdataTypeOf :: ISign -> DataType
dataTypeOf :: ISign -> DataType
$cdataCast1 :: forall (t :: Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ISign)
dataCast1 :: forall (t :: Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ISign)
$cdataCast2 :: forall (t :: Type -> Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ISign)
dataCast2 :: forall (t :: Type -> Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ISign)
$cgmapT :: (forall b. Data b => b -> b) -> ISign -> ISign
gmapT :: (forall b. Data b => b -> b) -> ISign -> ISign
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ISign -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ISign -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ISign -> r
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ISign -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> ISign -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> ISign -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ISign -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ISign -> u
$cgmapM :: forall (m :: Type -> Type).
Monad m =>
(forall d. Data d => d -> m d) -> ISign -> m ISign
gmapM :: forall (m :: Type -> Type).
Monad m =>
(forall d. Data d => d -> m d) -> ISign -> m ISign
$cgmapMp :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ISign -> m ISign
gmapMp :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ISign -> m ISign
$cgmapMo :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ISign -> m ISign
gmapMo :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ISign -> m ISign
Data, Int -> ISign -> ShowS
[ISign] -> ShowS
ISign -> String
(Int -> ISign -> ShowS)
-> (ISign -> String) -> ([ISign] -> ShowS) -> Show ISign
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ISign -> ShowS
showsPrec :: Int -> ISign -> ShowS
$cshow :: ISign -> String
show :: ISign -> String
$cshowList :: [ISign] -> ShowS
showList :: [ISign] -> ShowS
Show, ISign -> ISign -> Bool
(ISign -> ISign -> Bool) -> (ISign -> ISign -> Bool) -> Eq ISign
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ISign -> ISign -> Bool
== :: ISign -> ISign -> Bool
$c/= :: ISign -> ISign -> Bool
/= :: ISign -> ISign -> Bool
Eq)

-- | A type tagged with the endianness (byte order) to use when serializing.
--
-- Intended to be used to wrap existing types which do not otherwise expose
-- endianness, namely the machine integers 'Int32', 'Word64' etc. As such, it
-- derives various relevant type classes using the wrapped type.
--
-- May be considered a restricted 'Data.Tagged.Tagged' (from the @tagged@
-- package).
newtype Endian (end :: Endianness) a = Endian
    { -- | Discard endianness information.
      forall (end :: Endianness) a. Endian end a -> a
unEndian :: a }
    deriving stock ((forall x. Endian end a -> Rep (Endian end a) x)
-> (forall x. Rep (Endian end a) x -> Endian end a)
-> Generic (Endian end a)
forall x. Rep (Endian end a) x -> Endian end a
forall x. Endian end a -> Rep (Endian end a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (end :: Endianness) a x.
Rep (Endian end a) x -> Endian end a
forall (end :: Endianness) a x.
Endian end a -> Rep (Endian end a) x
$cfrom :: forall (end :: Endianness) a x.
Endian end a -> Rep (Endian end a) x
from :: forall x. Endian end a -> Rep (Endian end a) x
$cto :: forall (end :: Endianness) a x.
Rep (Endian end a) x -> Endian end a
to :: forall x. Rep (Endian end a) x -> Endian end a
Generic, Typeable (Endian end a)
Typeable (Endian end a)
-> (forall (c :: Type -> Type).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Endian end a -> c (Endian end a))
-> (forall (c :: Type -> Type).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (Endian end a))
-> (Endian end a -> Constr)
-> (Endian end a -> DataType)
-> (forall (t :: Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (Endian end a)))
-> (forall (t :: Type -> Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (Endian end a)))
-> ((forall b. Data b => b -> b) -> Endian end a -> Endian end a)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Endian end a -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Endian end a -> r)
-> (forall u. (forall d. Data d => d -> u) -> Endian end a -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> Endian end a -> u)
-> (forall (m :: Type -> Type).
    Monad m =>
    (forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a))
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a))
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a))
-> Data (Endian end a)
Endian end a -> Constr
Endian end a -> DataType
(forall b. Data b => b -> b) -> Endian end a -> Endian end a
forall a.
Typeable a
-> (forall (c :: Type -> Type).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: Type -> Type).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: Type -> Type -> Type) (c :: Type -> Type).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: Type -> Type).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: Type -> Type).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Endian end a -> u
forall u. (forall d. Data d => d -> u) -> Endian end a -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Endian end a -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Endian end a -> r
forall {end :: Endianness} {a}.
(Typeable end, Data a) =>
Typeable (Endian end a)
forall (end :: Endianness) a.
(Typeable end, Data a) =>
Endian end a -> Constr
forall (end :: Endianness) a.
(Typeable end, Data a) =>
Endian end a -> DataType
forall (end :: Endianness) a.
(Typeable end, Data a) =>
(forall b. Data b => b -> b) -> Endian end a -> Endian end a
forall (end :: Endianness) a u.
(Typeable end, Data a) =>
Int -> (forall d. Data d => d -> u) -> Endian end a -> u
forall (end :: Endianness) a u.
(Typeable end, Data a) =>
(forall d. Data d => d -> u) -> Endian end a -> [u]
forall (end :: Endianness) a r r'.
(Typeable end, Data a) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Endian end a -> r
forall (end :: Endianness) a r r'.
(Typeable end, Data a) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Endian end a -> r
forall (end :: Endianness) a (m :: Type -> Type).
(Typeable end, Data a, Monad m) =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
forall (end :: Endianness) a (m :: Type -> Type).
(Typeable end, Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
forall (end :: Endianness) a (c :: Type -> Type).
(Typeable end, Data a) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Endian end a)
forall (end :: Endianness) a (c :: Type -> Type).
(Typeable end, Data a) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Endian end a -> c (Endian end a)
forall (end :: Endianness) a (t :: Type -> Type)
       (c :: Type -> Type).
(Typeable end, Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Endian end a))
forall (end :: Endianness) a (t :: Type -> Type -> Type)
       (c :: Type -> Type).
(Typeable end, Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Endian end a))
forall (m :: Type -> Type).
Monad m =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
forall (c :: Type -> Type).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Endian end a)
forall (c :: Type -> Type).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Endian end a -> c (Endian end a)
forall (t :: Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Endian end a))
forall (t :: Type -> Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Endian end a))
$cgfoldl :: forall (end :: Endianness) a (c :: Type -> Type).
(Typeable end, Data a) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Endian end a -> c (Endian end a)
gfoldl :: forall (c :: Type -> Type).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Endian end a -> c (Endian end a)
$cgunfold :: forall (end :: Endianness) a (c :: Type -> Type).
(Typeable end, Data a) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Endian end a)
gunfold :: forall (c :: Type -> Type).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Endian end a)
$ctoConstr :: forall (end :: Endianness) a.
(Typeable end, Data a) =>
Endian end a -> Constr
toConstr :: Endian end a -> Constr
$cdataTypeOf :: forall (end :: Endianness) a.
(Typeable end, Data a) =>
Endian end a -> DataType
dataTypeOf :: Endian end a -> DataType
$cdataCast1 :: forall (end :: Endianness) a (t :: Type -> Type)
       (c :: Type -> Type).
(Typeable end, Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Endian end a))
dataCast1 :: forall (t :: Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Endian end a))
$cdataCast2 :: forall (end :: Endianness) a (t :: Type -> Type -> Type)
       (c :: Type -> Type).
(Typeable end, Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Endian end a))
dataCast2 :: forall (t :: Type -> Type -> Type) (c :: Type -> Type).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Endian end a))
$cgmapT :: forall (end :: Endianness) a.
(Typeable end, Data a) =>
(forall b. Data b => b -> b) -> Endian end a -> Endian end a
gmapT :: (forall b. Data b => b -> b) -> Endian end a -> Endian end a
$cgmapQl :: forall (end :: Endianness) a r r'.
(Typeable end, Data a) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Endian end a -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Endian end a -> r
$cgmapQr :: forall (end :: Endianness) a r r'.
(Typeable end, Data a) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Endian end a -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Endian end a -> r
$cgmapQ :: forall (end :: Endianness) a u.
(Typeable end, Data a) =>
(forall d. Data d => d -> u) -> Endian end a -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> Endian end a -> [u]
$cgmapQi :: forall (end :: Endianness) a u.
(Typeable end, Data a) =>
Int -> (forall d. Data d => d -> u) -> Endian end a -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Endian end a -> u
$cgmapM :: forall (end :: Endianness) a (m :: Type -> Type).
(Typeable end, Data a, Monad m) =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
gmapM :: forall (m :: Type -> Type).
Monad m =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
$cgmapMp :: forall (end :: Endianness) a (m :: Type -> Type).
(Typeable end, Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
gmapMp :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
$cgmapMo :: forall (end :: Endianness) a (m :: Type -> Type).
(Typeable end, Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
gmapMo :: forall (m :: Type -> Type).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Endian end a -> m (Endian end a)
Data, Int -> Endian end a -> ShowS
[Endian end a] -> ShowS
Endian end a -> String
(Int -> Endian end a -> ShowS)
-> (Endian end a -> String)
-> ([Endian end a] -> ShowS)
-> Show (Endian end a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (end :: Endianness) a.
Show a =>
Int -> Endian end a -> ShowS
forall (end :: Endianness) a. Show a => [Endian end a] -> ShowS
forall (end :: Endianness) a. Show a => Endian end a -> String
$cshowsPrec :: forall (end :: Endianness) a.
Show a =>
Int -> Endian end a -> ShowS
showsPrec :: Int -> Endian end a -> ShowS
$cshow :: forall (end :: Endianness) a. Show a => Endian end a -> String
show :: Endian end a -> String
$cshowList :: forall (end :: Endianness) a. Show a => [Endian end a] -> ShowS
showList :: [Endian end a] -> ShowS
Show)
    deriving (Endian end a -> Endian end a -> Bool
(Endian end a -> Endian end a -> Bool)
-> (Endian end a -> Endian end a -> Bool) -> Eq (Endian end a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (end :: Endianness) a.
Eq a =>
Endian end a -> Endian end a -> Bool
$c== :: forall (end :: Endianness) a.
Eq a =>
Endian end a -> Endian end a -> Bool
== :: Endian end a -> Endian end a -> Bool
$c/= :: forall (end :: Endianness) a.
Eq a =>
Endian end a -> Endian end a -> Bool
/= :: Endian end a -> Endian end a -> Bool
Eq, Eq (Endian end a)
Eq (Endian end a)
-> (Endian end a -> Endian end a -> Ordering)
-> (Endian end a -> Endian end a -> Bool)
-> (Endian end a -> Endian end a -> Bool)
-> (Endian end a -> Endian end a -> Bool)
-> (Endian end a -> Endian end a -> Bool)
-> (Endian end a -> Endian end a -> Endian end a)
-> (Endian end a -> Endian end a -> Endian end a)
-> Ord (Endian end a)
Endian end a -> Endian end a -> Bool
Endian end a -> Endian end a -> Ordering
Endian end a -> Endian end a -> Endian end a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {end :: Endianness} {a}. Ord a => Eq (Endian end a)
forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Bool
forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Ordering
forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Endian end a
$ccompare :: forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Ordering
compare :: Endian end a -> Endian end a -> Ordering
$c< :: forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Bool
< :: Endian end a -> Endian end a -> Bool
$c<= :: forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Bool
<= :: Endian end a -> Endian end a -> Bool
$c> :: forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Bool
> :: Endian end a -> Endian end a -> Bool
$c>= :: forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Bool
>= :: Endian end a -> Endian end a -> Bool
$cmax :: forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Endian end a
max :: Endian end a -> Endian end a -> Endian end a
$cmin :: forall (end :: Endianness) a.
Ord a =>
Endian end a -> Endian end a -> Endian end a
min :: Endian end a -> Endian end a -> Endian end a
Ord, Endian end a
Endian end a -> Endian end a -> Bounded (Endian end a)
forall a. a -> a -> Bounded a
forall (end :: Endianness) a. Bounded a => Endian end a
$cminBound :: forall (end :: Endianness) a. Bounded a => Endian end a
minBound :: Endian end a
$cmaxBound :: forall (end :: Endianness) a. Bounded a => Endian end a
maxBound :: Endian end a
Bounded, Integer -> Endian end a
Endian end a -> Endian end a
Endian end a -> Endian end a -> Endian end a
(Endian end a -> Endian end a -> Endian end a)
-> (Endian end a -> Endian end a -> Endian end a)
-> (Endian end a -> Endian end a -> Endian end a)
-> (Endian end a -> Endian end a)
-> (Endian end a -> Endian end a)
-> (Endian end a -> Endian end a)
-> (Integer -> Endian end a)
-> Num (Endian end a)
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
forall (end :: Endianness) a. Num a => Integer -> Endian end a
forall (end :: Endianness) a. Num a => Endian end a -> Endian end a
forall (end :: Endianness) a.
Num a =>
Endian end a -> Endian end a -> Endian end a
$c+ :: forall (end :: Endianness) a.
Num a =>
Endian end a -> Endian end a -> Endian end a
+ :: Endian end a -> Endian end a -> Endian end a
$c- :: forall (end :: Endianness) a.
Num a =>
Endian end a -> Endian end a -> Endian end a
- :: Endian end a -> Endian end a -> Endian end a
$c* :: forall (end :: Endianness) a.
Num a =>
Endian end a -> Endian end a -> Endian end a
* :: Endian end a -> Endian end a -> Endian end a
$cnegate :: forall (end :: Endianness) a. Num a => Endian end a -> Endian end a
negate :: Endian end a -> Endian end a
$cabs :: forall (end :: Endianness) a. Num a => Endian end a -> Endian end a
abs :: Endian end a -> Endian end a
$csignum :: forall (end :: Endianness) a. Num a => Endian end a -> Endian end a
signum :: Endian end a -> Endian end a
$cfromInteger :: forall (end :: Endianness) a. Num a => Integer -> Endian end a
fromInteger :: Integer -> Endian end a
Num, Int -> Endian end a
Endian end a -> Int
Endian end a -> [Endian end a]
Endian end a -> Endian end a
Endian end a -> Endian end a -> [Endian end a]
Endian end a -> Endian end a -> Endian end a -> [Endian end a]
(Endian end a -> Endian end a)
-> (Endian end a -> Endian end a)
-> (Int -> Endian end a)
-> (Endian end a -> Int)
-> (Endian end a -> [Endian end a])
-> (Endian end a -> Endian end a -> [Endian end a])
-> (Endian end a -> Endian end a -> [Endian end a])
-> (Endian end a -> Endian end a -> Endian end a -> [Endian end a])
-> Enum (Endian end a)
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
forall (end :: Endianness) a. Enum a => Int -> Endian end a
forall (end :: Endianness) a. Enum a => Endian end a -> Int
forall (end :: Endianness) a.
Enum a =>
Endian end a -> [Endian end a]
forall (end :: Endianness) a.
Enum a =>
Endian end a -> Endian end a
forall (end :: Endianness) a.
Enum a =>
Endian end a -> Endian end a -> [Endian end a]
forall (end :: Endianness) a.
Enum a =>
Endian end a -> Endian end a -> Endian end a -> [Endian end a]
$csucc :: forall (end :: Endianness) a.
Enum a =>
Endian end a -> Endian end a
succ :: Endian end a -> Endian end a
$cpred :: forall (end :: Endianness) a.
Enum a =>
Endian end a -> Endian end a
pred :: Endian end a -> Endian end a
$ctoEnum :: forall (end :: Endianness) a. Enum a => Int -> Endian end a
toEnum :: Int -> Endian end a
$cfromEnum :: forall (end :: Endianness) a. Enum a => Endian end a -> Int
fromEnum :: Endian end a -> Int
$cenumFrom :: forall (end :: Endianness) a.
Enum a =>
Endian end a -> [Endian end a]
enumFrom :: Endian end a -> [Endian end a]
$cenumFromThen :: forall (end :: Endianness) a.
Enum a =>
Endian end a -> Endian end a -> [Endian end a]
enumFromThen :: Endian end a -> Endian end a -> [Endian end a]
$cenumFromTo :: forall (end :: Endianness) a.
Enum a =>
Endian end a -> Endian end a -> [Endian end a]
enumFromTo :: Endian end a -> Endian end a -> [Endian end a]
$cenumFromThenTo :: forall (end :: Endianness) a.
Enum a =>
Endian end a -> Endian end a -> Endian end a -> [Endian end a]
enumFromThenTo :: Endian end a -> Endian end a -> Endian end a -> [Endian end a]
Enum, Num (Endian end a)
Ord (Endian end a)
Num (Endian end a)
-> Ord (Endian end a)
-> (Endian end a -> Rational)
-> Real (Endian end a)
Endian end a -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
forall {end :: Endianness} {a}. Real a => Num (Endian end a)
forall {end :: Endianness} {a}. Real a => Ord (Endian end a)
forall (end :: Endianness) a. Real a => Endian end a -> Rational
$ctoRational :: forall (end :: Endianness) a. Real a => Endian end a -> Rational
toRational :: Endian end a -> Rational
Real, Enum (Endian end a)
Real (Endian end a)
Real (Endian end a)
-> Enum (Endian end a)
-> (Endian end a -> Endian end a -> Endian end a)
-> (Endian end a -> Endian end a -> Endian end a)
-> (Endian end a -> Endian end a -> Endian end a)
-> (Endian end a -> Endian end a -> Endian end a)
-> (Endian end a -> Endian end a -> (Endian end a, Endian end a))
-> (Endian end a -> Endian end a -> (Endian end a, Endian end a))
-> (Endian end a -> Integer)
-> Integral (Endian end a)
Endian end a -> Integer
Endian end a -> Endian end a -> (Endian end a, Endian end a)
Endian end a -> Endian end a -> Endian end a
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
forall {end :: Endianness} {a}. Integral a => Enum (Endian end a)
forall {end :: Endianness} {a}. Integral a => Real (Endian end a)
forall (end :: Endianness) a. Integral a => Endian end a -> Integer
forall (end :: Endianness) a.
Integral a =>
Endian end a -> Endian end a -> (Endian end a, Endian end a)
forall (end :: Endianness) a.
Integral a =>
Endian end a -> Endian end a -> Endian end a
$cquot :: forall (end :: Endianness) a.
Integral a =>
Endian end a -> Endian end a -> Endian end a
quot :: Endian end a -> Endian end a -> Endian end a
$crem :: forall (end :: Endianness) a.
Integral a =>
Endian end a -> Endian end a -> Endian end a
rem :: Endian end a -> Endian end a -> Endian end a
$cdiv :: forall (end :: Endianness) a.
Integral a =>
Endian end a -> Endian end a -> Endian end a
div :: Endian end a -> Endian end a -> Endian end a
$cmod :: forall (end :: Endianness) a.
Integral a =>
Endian end a -> Endian end a -> Endian end a
mod :: Endian end a -> Endian end a -> Endian end a
$cquotRem :: forall (end :: Endianness) a.
Integral a =>
Endian end a -> Endian end a -> (Endian end a, Endian end a)
quotRem :: Endian end a -> Endian end a -> (Endian end a, Endian end a)
$cdivMod :: forall (end :: Endianness) a.
Integral a =>
Endian end a -> Endian end a -> (Endian end a, Endian end a)
divMod :: Endian end a -> Endian end a -> (Endian end a, Endian end a)
$ctoInteger :: forall (end :: Endianness) a. Integral a => Endian end a -> Integer
toInteger :: Endian end a -> Integer
Integral) via a
    deriving (IsCBLen (Endian end a)
forall {k} (a :: k). IsCBLen a
IsCBLen, Endian end a -> Int
(Endian end a -> Int) -> BLen (Endian end a)
forall a. (a -> Int) -> BLen a
forall (end :: Endianness) a. BLen a => Endian end a -> Int
$cblen :: forall (end :: Endianness) a. BLen a => Endian end a -> Int
blen :: Endian end a -> Int
Simple.BLen) via a
    deriving (Endian end a -> Weak (Endian end a)
(Endian end a -> Weak (Endian end a)) -> Weaken (Endian end a)
forall a. (a -> Weak a) -> Weaken a
forall (end :: Endianness) a.
Weaken a =>
Endian end a -> Weak (Endian end a)
$cweaken :: forall (end :: Endianness) a.
Weaken a =>
Endian end a -> Weak (Endian end a)
weaken :: Endian end a -> Weak (Endian end a)
Weaken, Weaken (Endian end a)
Weaken (Endian end a)
-> (Weak (Endian end a) -> Result (Endian end a))
-> Strengthen (Endian end a)
Weak (Endian end a) -> Result (Endian end a)
forall a. Weaken a -> (Weak a -> Result a) -> Strengthen a
forall {end :: Endianness} {a}.
Strengthen a =>
Weaken (Endian end a)
forall (end :: Endianness) a.
Strengthen a =>
Weak (Endian end a) -> Result (Endian end a)
$cstrengthen :: forall (end :: Endianness) a.
Strengthen a =>
Weak (Endian end a) -> Result (Endian end a)
strengthen :: Weak (Endian end a) -> Result (Endian end a)
Strengthen) via a
    deriving ([Endian end a] -> Value
[Endian end a] -> Encoding
Endian end a -> Value
Endian end a -> Encoding
(Endian end a -> Value)
-> (Endian end a -> Encoding)
-> ([Endian end a] -> Value)
-> ([Endian end a] -> Encoding)
-> ToJSON (Endian end a)
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
forall (end :: Endianness) a. ToJSON a => [Endian end a] -> Value
forall (end :: Endianness) a.
ToJSON a =>
[Endian end a] -> Encoding
forall (end :: Endianness) a. ToJSON a => Endian end a -> Value
forall (end :: Endianness) a. ToJSON a => Endian end a -> Encoding
$ctoJSON :: forall (end :: Endianness) a. ToJSON a => Endian end a -> Value
toJSON :: Endian end a -> Value
$ctoEncoding :: forall (end :: Endianness) a. ToJSON a => Endian end a -> Encoding
toEncoding :: Endian end a -> Encoding
$ctoJSONList :: forall (end :: Endianness) a. ToJSON a => [Endian end a] -> Value
toJSONList :: [Endian end a] -> Value
$ctoEncodingList :: forall (end :: Endianness) a.
ToJSON a =>
[Endian end a] -> Encoding
toEncodingList :: [Endian end a] -> Encoding
ToJSON, Value -> Parser [Endian end a]
Value -> Parser (Endian end a)
(Value -> Parser (Endian end a))
-> (Value -> Parser [Endian end a]) -> FromJSON (Endian end a)
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
forall (end :: Endianness) a.
FromJSON a =>
Value -> Parser [Endian end a]
forall (end :: Endianness) a.
FromJSON a =>
Value -> Parser (Endian end a)
$cparseJSON :: forall (end :: Endianness) a.
FromJSON a =>
Value -> Parser (Endian end a)
parseJSON :: Value -> Parser (Endian end a)
$cparseJSONList :: forall (end :: Endianness) a.
FromJSON a =>
Value -> Parser [Endian end a]
parseJSONList :: Value -> Parser [Endian end a]
FromJSON) via a

-- | Endianness doesn't matter for single bytes.
deriving via Binreply Word8 instance Mason.Put (Endian end Word8)

-- | Endianness doesn't matter for single bytes.
deriving via Binreply Word8 instance Flatparse.Get (Endian end Word8)

-- | Endianness doesn't matter for single bytes.
deriving via Binreply  Int8 instance Mason.Put (Endian end  Int8)

-- | Endianness doesn't matter for single bytes.
deriving via Binreply  Int8 instance Flatparse.Get (Endian end  Int8)

{- 2023-02-01 raehik:
byteswapping should be faster than poking "backwards" byte by byte. confirmed
with nikita-volkov's ptr-poker package via benchmarks (single operation ~2%
faster) and inspecting disassembly (byteswapX is inlined at the assembly level
as BSWAP, byte by byte takes lots of MOVs and SHRs)

2023-02-18 raehik: this change is applied to nikita-volkov's ptr-poker pkg :)
-}

-- | Ask for a minimum length before running the given parser and wrapping the
--   result in 'Endian'.
flatparseParseEndianMin
    :: Flatparse.Getter a -> Int -> Flatparse.Getter (Endian end a)
flatparseParseEndianMin :: forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter a
f Int
n =
    a -> Endian end a
forall (end :: Endianness) a. a -> Endian end a
Endian (a -> Endian end a)
-> Getter a -> ParserT PureMode E (Endian end a)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Getter a -> EBase -> Getter a
forall a. Getter a -> EBase -> Getter a
Flatparse.getEBase Getter a
f (Int -> EBase
Flatparse.ERanOut Int
n)

instance Bytezap.Put (Endian 'LE Word16) where put :: Endian 'LE Word16 -> Poke
put = Word16 -> Poke
BZ.w16le (Word16 -> Poke)
-> (Endian 'LE Word16 -> Word16) -> Endian 'LE Word16 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'LE Word16 -> Word16
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'LE Word16) where
    get :: Getter (Endian 'LE Word16)
get = Getter Word16 -> Int -> Getter (Endian 'LE Word16)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Word16
forall (st :: ZeroBitType) e. ParserT st e Word16
FP.anyWord16le Int
2
instance Bytezap.Put (Endian 'BE Word16) where put :: Endian 'BE Word16 -> Poke
put = Word16 -> Poke
BZ.w16be (Word16 -> Poke)
-> (Endian 'BE Word16 -> Word16) -> Endian 'BE Word16 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'BE Word16 -> Word16
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'BE Word16) where
    get :: Getter (Endian 'BE Word16)
get = Getter Word16 -> Int -> Getter (Endian 'BE Word16)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Word16
forall (st :: ZeroBitType) e. ParserT st e Word16
FP.anyWord16be Int
2

instance Bytezap.Put (Endian 'LE Word32) where put :: Endian 'LE Word32 -> Poke
put = Word32 -> Poke
BZ.w32le (Word32 -> Poke)
-> (Endian 'LE Word32 -> Word32) -> Endian 'LE Word32 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'LE Word32 -> Word32
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'LE Word32) where
    get :: Getter (Endian 'LE Word32)
get = Getter Word32 -> Int -> Getter (Endian 'LE Word32)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Word32
forall (st :: ZeroBitType) e. ParserT st e Word32
FP.anyWord32le Int
4
instance Bytezap.Put (Endian 'BE Word32) where put :: Endian 'BE Word32 -> Poke
put = Word32 -> Poke
BZ.w32be (Word32 -> Poke)
-> (Endian 'BE Word32 -> Word32) -> Endian 'BE Word32 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'BE Word32 -> Word32
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'BE Word32) where
    get :: Getter (Endian 'BE Word32)
get = Getter Word32 -> Int -> Getter (Endian 'BE Word32)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Word32
forall (st :: ZeroBitType) e. ParserT st e Word32
FP.anyWord32be Int
4

instance Bytezap.Put (Endian 'LE Word64) where put :: Endian 'LE Word64 -> Poke
put = Word64 -> Poke
BZ.w64le (Word64 -> Poke)
-> (Endian 'LE Word64 -> Word64) -> Endian 'LE Word64 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'LE Word64 -> Word64
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'LE Word64) where
    get :: Getter (Endian 'LE Word64)
get = Getter Word64 -> Int -> Getter (Endian 'LE Word64)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Word64
forall (st :: ZeroBitType) e. ParserT st e Word64
FP.anyWord64le Int
8
instance Bytezap.Put (Endian 'BE Word64) where put :: Endian 'BE Word64 -> Poke
put = Word64 -> Poke
BZ.w64be (Word64 -> Poke)
-> (Endian 'BE Word64 -> Word64) -> Endian 'BE Word64 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'BE Word64 -> Word64
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'BE Word64) where
    get :: Getter (Endian 'BE Word64)
get = Getter Word64 -> Int -> Getter (Endian 'BE Word64)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Word64
forall (st :: ZeroBitType) e. ParserT st e Word64
FP.anyWord64be Int
8

instance Bytezap.Put (Endian 'LE Int16) where put :: Endian 'LE Int16 -> Poke
put = Int16 -> Poke
BZ.i16le (Int16 -> Poke)
-> (Endian 'LE Int16 -> Int16) -> Endian 'LE Int16 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'LE Int16 -> Int16
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'LE Int16) where
    get :: Getter (Endian 'LE Int16)
get = Getter Int16 -> Int -> Getter (Endian 'LE Int16)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Int16
forall (st :: ZeroBitType) e. ParserT st e Int16
FP.anyInt16le Int
2
instance Bytezap.Put (Endian 'BE Int16) where put :: Endian 'BE Int16 -> Poke
put = Int16 -> Poke
BZ.i16be (Int16 -> Poke)
-> (Endian 'BE Int16 -> Int16) -> Endian 'BE Int16 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'BE Int16 -> Int16
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'BE Int16) where
    get :: Getter (Endian 'BE Int16)
get = Getter Int16 -> Int -> Getter (Endian 'BE Int16)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Int16
forall (st :: ZeroBitType) e. ParserT st e Int16
FP.anyInt16be Int
2

instance Bytezap.Put (Endian 'LE Int32) where put :: Endian 'LE Int32 -> Poke
put = Int32 -> Poke
BZ.i32le (Int32 -> Poke)
-> (Endian 'LE Int32 -> Int32) -> Endian 'LE Int32 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'LE Int32 -> Int32
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'LE Int32) where
    get :: Getter (Endian 'LE Int32)
get = Getter Int32 -> Int -> Getter (Endian 'LE Int32)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Int32
forall (st :: ZeroBitType) e. ParserT st e Int32
FP.anyInt32le Int
4
instance Bytezap.Put (Endian 'BE Int32) where put :: Endian 'BE Int32 -> Poke
put = Int32 -> Poke
BZ.i32be (Int32 -> Poke)
-> (Endian 'BE Int32 -> Int32) -> Endian 'BE Int32 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'BE Int32 -> Int32
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'BE Int32) where
    get :: Getter (Endian 'BE Int32)
get = Getter Int32 -> Int -> Getter (Endian 'BE Int32)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Int32
forall (st :: ZeroBitType) e. ParserT st e Int32
FP.anyInt32be Int
4

instance Bytezap.Put (Endian 'LE Int64) where put :: Endian 'LE Int64 -> Poke
put = Int64 -> Poke
BZ.i64le (Int64 -> Poke)
-> (Endian 'LE Int64 -> Int64) -> Endian 'LE Int64 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'LE Int64 -> Int64
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'LE Int64) where
    get :: Getter (Endian 'LE Int64)
get = Getter Int64 -> Int -> Getter (Endian 'LE Int64)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Int64
forall (st :: ZeroBitType) e. ParserT st e Int64
FP.anyInt64le Int
8
instance Bytezap.Put (Endian 'BE Int64) where put :: Endian 'BE Int64 -> Poke
put = Int64 -> Poke
BZ.i64be (Int64 -> Poke)
-> (Endian 'BE Int64 -> Int64) -> Endian 'BE Int64 -> Poke
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Endian 'BE Int64 -> Int64
forall (end :: Endianness) a. Endian end a -> a
unEndian
instance Flatparse.Get (Endian 'BE Int64) where
    get :: Getter (Endian 'BE Int64)
get = Getter Int64 -> Int -> Getter (Endian 'BE Int64)
forall a (end :: Endianness).
Getter a -> Int -> Getter (Endian end a)
flatparseParseEndianMin Getter Int64
forall (st :: ZeroBitType) e. ParserT st e Int64
FP.anyInt64be Int
8

-- | Grouping for matching a signedness and size to a Haskell integer data type.
type family IRep (isign :: ISign) (isize :: Natural) where
    IRep 'U 8 = Word8
    IRep 'I 8 =  Int8
    IRep 'U 16 = Word16
    IRep 'I 16 =  Int16
    IRep 'U 32 = Word32
    IRep 'I 32 =  Int32
    IRep 'U 64 = Word64
    IRep 'I 64 =  Int64

-- | Largest representable value for a machine integer made of @n@ bits.
--
-- If signed ''I', twos complement is used, so negative range has 1 extra value.
type family IMax (isign :: ISign) (n :: Natural) :: Natural where
    IMax 'U n = 2^n-1
    IMax 'I n = 2^(n-1)