{-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} module Data.SerDoc.Binary.Codec where import Data.SerDoc.Class as SerDoc import Data.SerDoc.Info import qualified Data.Binary as B import qualified Data.Binary.Put as B import Data.ByteString (ByteString) import qualified Data.ByteString.Lazy as LBS import Data.ByteString.Short (ShortByteString) import Data.Int import Data.List import Data.Proxy import Data.Word import Numeric.Natural data BinaryCodec instance Codec BinaryCodec where type MonadEncode BinaryCodec = B.PutM type MonadDecode BinaryCodec = B.Get newtype ViaBinary a = ViaBinary { forall a. ViaBinary a -> a viaBinary :: a } instance B.Binary a => Serializable BinaryCodec (ViaBinary a) where encode :: Proxy BinaryCodec -> ViaBinary a -> MonadEncode BinaryCodec () encode Proxy BinaryCodec _ = a -> Put forall t. Binary t => t -> Put B.put (a -> Put) -> (ViaBinary a -> a) -> ViaBinary a -> Put forall b c a. (b -> c) -> (a -> b) -> a -> c . ViaBinary a -> a forall a. ViaBinary a -> a viaBinary decode :: Proxy BinaryCodec -> MonadDecode BinaryCodec (ViaBinary a) decode Proxy BinaryCodec _ = a -> ViaBinary a forall a. a -> ViaBinary a ViaBinary (a -> ViaBinary a) -> Get a -> Get (ViaBinary a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Get a forall t. Binary t => Get t B.get instance HasInfo BinaryCodec () where info :: Proxy BinaryCodec -> Proxy () -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy () _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "()" (Int -> FieldSize FixedSize Int 0) deriving via (ViaBinary ()) instance Serializable BinaryCodec () instance HasInfo BinaryCodec Bool where info :: Proxy BinaryCodec -> Proxy Bool -> FieldInfo BinaryCodec info Proxy BinaryCodec codec Proxy Bool p = Proxy BinaryCodec -> Proxy Bool -> Proxy Word8 -> FieldInfo BinaryCodec forall codec a n. (Typeable a, Show a, Enum a, Bounded a, Codec codec, HasInfo codec n, HasInfo codec (DefEnumEncoding codec)) => Proxy codec -> Proxy a -> Proxy n -> FieldInfo codec enumInfo Proxy BinaryCodec codec Proxy Bool p (forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @Word8) deriving via (ViaBinary Bool) instance Serializable BinaryCodec Bool instance HasInfo BinaryCodec Ordering where info :: Proxy BinaryCodec -> Proxy Ordering -> FieldInfo BinaryCodec info Proxy BinaryCodec codec Proxy Ordering p = Proxy BinaryCodec -> Proxy Ordering -> Proxy Word8 -> FieldInfo BinaryCodec forall codec a n. (Typeable a, Show a, Enum a, Bounded a, Codec codec, HasInfo codec n, HasInfo codec (DefEnumEncoding codec)) => Proxy codec -> Proxy a -> Proxy n -> FieldInfo codec enumInfo Proxy BinaryCodec codec Proxy Ordering p (forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @Word8) deriving via (ViaBinary Ordering) instance Serializable BinaryCodec Ordering instance HasInfo BinaryCodec Word8 where info :: Proxy BinaryCodec -> Proxy Word8 -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Word8 _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Word8" (Int -> FieldSize FixedSize Int 1) deriving via (ViaBinary Word8) instance Serializable BinaryCodec Word8 instance HasInfo BinaryCodec Word16 where info :: Proxy BinaryCodec -> Proxy Word16 -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Word16 _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Word16BE" (Int -> FieldSize FixedSize Int 2) deriving via (ViaBinary Word16) instance Serializable BinaryCodec Word16 instance HasInfo BinaryCodec Word32 where info :: Proxy BinaryCodec -> Proxy Word32 -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Word32 _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Word32BE" (Int -> FieldSize FixedSize Int 4) deriving via (ViaBinary Word32) instance Serializable BinaryCodec Word32 instance HasInfo BinaryCodec Word64 where info :: Proxy BinaryCodec -> Proxy Word64 -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Word64 _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Word64BE" (Int -> FieldSize FixedSize Int 8) deriving via (ViaBinary Word64) instance Serializable BinaryCodec Word64 instance HasInfo BinaryCodec Word where info :: Proxy BinaryCodec -> Proxy Word -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Word _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Word64BE" (Int -> FieldSize FixedSize Int 8) deriving via (ViaBinary Word) instance Serializable BinaryCodec Word instance HasInfo BinaryCodec Int8 where info :: Proxy BinaryCodec -> Proxy Int8 -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Int8 _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Int8" (Int -> FieldSize FixedSize Int 1) deriving via (ViaBinary Int8) instance Serializable BinaryCodec Int8 instance HasInfo BinaryCodec Int16 where info :: Proxy BinaryCodec -> Proxy Int16 -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Int16 _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Int16BE" (Int -> FieldSize FixedSize Int 2) deriving via (ViaBinary Int16) instance Serializable BinaryCodec Int16 instance HasInfo BinaryCodec Int32 where info :: Proxy BinaryCodec -> Proxy Int32 -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Int32 _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Int32BE" (Int -> FieldSize FixedSize Int 4) deriving via (ViaBinary Int32) instance Serializable BinaryCodec Int32 instance HasInfo BinaryCodec Int64 where info :: Proxy BinaryCodec -> Proxy Int64 -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Int64 _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Int64BE" (Int -> FieldSize FixedSize Int 8) deriving via (ViaBinary Int64) instance Serializable BinaryCodec Int64 instance HasInfo BinaryCodec Int where info :: Proxy BinaryCodec -> Proxy Int -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Int _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Int64BE" (Int -> FieldSize FixedSize Int 8) deriving via (ViaBinary Int) instance Serializable BinaryCodec Int instance HasInfo BinaryCodec Float where info :: Proxy BinaryCodec -> Proxy Float -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Float _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Float" FieldSize UnknownSize deriving via (ViaBinary Float) instance Serializable BinaryCodec Float instance HasInfo BinaryCodec Double where info :: Proxy BinaryCodec -> Proxy Double -> FieldInfo BinaryCodec info Proxy BinaryCodec _ Proxy Double _ = String -> FieldSize -> FieldInfo BinaryCodec forall codec. String -> FieldSize -> FieldInfo codec basicField String "Double" FieldSize UnknownSize deriving via (ViaBinary Double) instance Serializable BinaryCodec Double instance HasInfo BinaryCodec Integer where info :: Proxy BinaryCodec -> Proxy Integer -> FieldInfo BinaryCodec info Proxy BinaryCodec codec Proxy Integer _ = String -> [(String, FieldInfo BinaryCodec)] -> FieldInfo BinaryCodec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String "Integer" [ (String "big", Proxy BinaryCodec -> Proxy Bool -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Bool forall {k} (t :: k). Proxy t Proxy :: Proxy Bool)) , (String "data", ChoiceCondition -> [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. ChoiceCondition -> [FieldInfo codec] -> FieldInfo codec choiceField (String -> ChoiceCondition IndexField String "big") [ Proxy BinaryCodec -> Proxy Int32 -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Int32 forall {k} (t :: k). Proxy t Proxy :: Proxy Int32) , String -> [(String, FieldInfo BinaryCodec)] -> FieldInfo BinaryCodec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String "BigInteger" [ (String "sign", Proxy BinaryCodec -> Proxy Word8 -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Word8 forall {k} (t :: k). Proxy t Proxy :: Proxy Word8)) , (String "dataBytes", Proxy BinaryCodec -> Proxy [Word8] -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy [Word8] forall {k} (t :: k). Proxy t Proxy :: Proxy [Word8])) ] ] ) ] deriving via (ViaBinary Integer) instance Serializable BinaryCodec Integer instance HasInfo BinaryCodec Natural where info :: Proxy BinaryCodec -> Proxy Natural -> FieldInfo BinaryCodec info Proxy BinaryCodec codec Proxy Natural _ = String -> [(String, FieldInfo BinaryCodec)] -> FieldInfo BinaryCodec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String "Natural" [ (String "big", Proxy BinaryCodec -> Proxy Bool -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Bool forall {k} (t :: k). Proxy t Proxy :: Proxy Bool)) , (String "data", ChoiceCondition -> [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. ChoiceCondition -> [FieldInfo codec] -> FieldInfo codec choiceField (String -> ChoiceCondition IndexField String "big") [ Proxy BinaryCodec -> Proxy Word64 -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Word64 forall {k} (t :: k). Proxy t Proxy :: Proxy Word64) , Proxy BinaryCodec -> Proxy [Word8] -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy [Word8] forall {k} (t :: k). Proxy t Proxy :: Proxy [Word8]) ] ) ] deriving via (ViaBinary Natural) instance Serializable BinaryCodec Natural instance HasInfo BinaryCodec a => HasInfo BinaryCodec [a] where info :: Proxy BinaryCodec -> Proxy [a] -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy [a] _ :: Proxy [a]) = String -> [(String, FieldInfo BinaryCodec)] -> FieldInfo BinaryCodec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String "List" [ (String "length", Proxy BinaryCodec -> Proxy Int -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Int forall {k} (t :: k). Proxy t Proxy :: Proxy Int)) , (String "items", FieldSize -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall codec. FieldSize -> FieldInfo codec -> FieldInfo codec listField (String -> FieldSize VarSize String "length") (Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a))) ] deriving via (ViaBinary [a]) instance B.Binary a => Serializable BinaryCodec [a] instance HasInfo BinaryCodec a => HasInfo BinaryCodec (Maybe a) where info :: Proxy BinaryCodec -> Proxy (Maybe a) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (Maybe a) _ :: Proxy (Maybe a)) = String -> [(String, FieldInfo BinaryCodec)] -> FieldInfo BinaryCodec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String "Maybe" [ (String "isJust", Proxy BinaryCodec -> Proxy Word8 -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Word8 forall {k} (t :: k). Proxy t Proxy :: Proxy Word8)) , (String "value", ChoiceCondition -> [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. ChoiceCondition -> [FieldInfo codec] -> FieldInfo codec choiceField (String -> ChoiceCondition IndexField String "isJust") [ String -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall codec. String -> FieldInfo codec -> FieldInfo codec AnnField String "Nothing" (FieldInfo BinaryCodec -> FieldInfo BinaryCodec) -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall a b. (a -> b) -> a -> b $ Proxy BinaryCodec -> Proxy () -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy () forall {k} (t :: k). Proxy t Proxy :: Proxy ()) , String -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall codec. String -> FieldInfo codec -> FieldInfo codec AnnField String "Just" (FieldInfo BinaryCodec -> FieldInfo BinaryCodec) -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall a b. (a -> b) -> a -> b $ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) ] ) ] deriving via (ViaBinary (Maybe a)) instance B.Binary a => Serializable BinaryCodec (Maybe a) instance (HasInfo BinaryCodec a, HasInfo BinaryCodec b) => HasInfo BinaryCodec (Either a b) where info :: Proxy BinaryCodec -> Proxy (Either a b) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (Either a b) _ :: Proxy (Either a b)) = String -> [(String, FieldInfo BinaryCodec)] -> FieldInfo BinaryCodec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String "Either" [ (String "constructor", Proxy BinaryCodec -> Proxy Word8 -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Word8 forall {k} (t :: k). Proxy t Proxy :: Proxy Word8)) , (String "value", ChoiceCondition -> [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. ChoiceCondition -> [FieldInfo codec] -> FieldInfo codec choiceField (String -> ChoiceCondition IndexField String "constructor") [ String -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall codec. String -> FieldInfo codec -> FieldInfo codec AnnField String "Left" (FieldInfo BinaryCodec -> FieldInfo BinaryCodec) -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall a b. (a -> b) -> a -> b $ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , String -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall codec. String -> FieldInfo codec -> FieldInfo codec AnnField String "Right" (FieldInfo BinaryCodec -> FieldInfo BinaryCodec) -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall a b. (a -> b) -> a -> b $ Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) ] ) ] deriving via (ViaBinary (Either a b)) instance (B.Binary a, B.Binary b) => Serializable BinaryCodec (Either a b) tupleInfo :: [FieldInfo codec] -> FieldInfo codec tupleInfo :: forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [FieldInfo codec] fieldInfos = String -> [(String, FieldInfo codec)] -> FieldInfo codec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String combinedName [(String, FieldInfo codec)] subfieldInfos where combinedName :: String combinedName = String "(" String -> String -> String forall a. Semigroup a => a -> a -> a <> ([String] -> String forall a. Monoid a => [a] -> a mconcat ([String] -> String) -> ([String] -> [String]) -> [String] -> String forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> [String] -> [String] forall a. a -> [a] -> [a] intersperse String ",") ((FieldInfo codec -> String) -> [FieldInfo codec] -> [String] forall a b. (a -> b) -> [a] -> [b] map FieldInfo codec -> String forall codec. FieldInfo codec -> String shortFieldType [FieldInfo codec] fieldInfos) String -> String -> String forall a. Semigroup a => a -> a -> a <> String ")" subfieldInfos :: [(String, FieldInfo codec)] subfieldInfos = [ (String "elem" String -> String -> String forall a. Semigroup a => a -> a -> a <> Int -> String forall a. Show a => a -> String show (Int n :: Int), FieldInfo codec fi) | (Int n, FieldInfo codec fi) <- [Int] -> [FieldInfo codec] -> [(Int, FieldInfo codec)] forall a b. [a] -> [b] -> [(a, b)] zip [Int 0,Int 1..] [FieldInfo codec] fieldInfos ] deriving via (ViaBinary (a, b)) instance ( B.Binary a , B.Binary b ) => Serializable BinaryCodec (a, b) deriving via (ViaBinary (a, b, c)) instance ( B.Binary a , B.Binary b , B.Binary c ) => Serializable BinaryCodec (a, b, c) deriving via (ViaBinary (a, b, c, d)) instance ( B.Binary a , B.Binary b , B.Binary c , B.Binary d ) => Serializable BinaryCodec (a, b, c, d) deriving via (ViaBinary (a, b, c, d, e)) instance ( B.Binary a , B.Binary b , B.Binary c , B.Binary d , B.Binary e ) => Serializable BinaryCodec (a, b, c, d, e) deriving via (ViaBinary (a, b, c, d, e, f)) instance ( B.Binary a , B.Binary b , B.Binary c , B.Binary d , B.Binary e , B.Binary f ) => Serializable BinaryCodec (a, b, c, d, e, f) deriving via (ViaBinary (a, b, c, d, e, f, g)) instance ( B.Binary a , B.Binary b , B.Binary c , B.Binary d , B.Binary e , B.Binary f , B.Binary g ) => Serializable BinaryCodec (a, b, c, d, e, f, g) deriving via (ViaBinary (a, b, c, d, e, f, g, h)) instance ( B.Binary a , B.Binary b , B.Binary c , B.Binary d , B.Binary e , B.Binary f , B.Binary g , B.Binary h ) => Serializable BinaryCodec (a, b, c, d, e, f, g, h) deriving via (ViaBinary (a, b, c, d, e, f, g, h, i)) instance ( B.Binary a , B.Binary b , B.Binary c , B.Binary d , B.Binary e , B.Binary f , B.Binary g , B.Binary h , B.Binary i ) => Serializable BinaryCodec (a, b, c, d, e, f, g, h, i) deriving via (ViaBinary (a, b, c, d, e, f, g, h, i, j)) instance ( B.Binary a , B.Binary b , B.Binary c , B.Binary d , B.Binary e , B.Binary f , B.Binary g , B.Binary h , B.Binary i , B.Binary j ) => Serializable BinaryCodec (a, b, c, d, e, f, g, h, i, j) instance ( HasInfo BinaryCodec a , HasInfo BinaryCodec b ) => HasInfo BinaryCodec (a, b) where info :: Proxy BinaryCodec -> Proxy (a, b) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (a, b) _ :: Proxy (a, b)) = [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) ] instance ( HasInfo BinaryCodec a , HasInfo BinaryCodec b , HasInfo BinaryCodec c ) => HasInfo BinaryCodec (a, b, c) where info :: Proxy BinaryCodec -> Proxy (a, b, c) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (a, b, c) _ :: Proxy (a, b, c)) = [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) , Proxy BinaryCodec -> Proxy c -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy c forall {k} (t :: k). Proxy t Proxy :: Proxy c) ] instance ( HasInfo BinaryCodec a , HasInfo BinaryCodec b , HasInfo BinaryCodec c , HasInfo BinaryCodec d ) => HasInfo BinaryCodec (a, b, c, d) where info :: Proxy BinaryCodec -> Proxy (a, b, c, d) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (a, b, c, d) _ :: Proxy (a, b, c, d)) = [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) , Proxy BinaryCodec -> Proxy c -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy c forall {k} (t :: k). Proxy t Proxy :: Proxy c) , Proxy BinaryCodec -> Proxy d -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy d forall {k} (t :: k). Proxy t Proxy :: Proxy d) ] instance ( HasInfo BinaryCodec a , HasInfo BinaryCodec b , HasInfo BinaryCodec c , HasInfo BinaryCodec d , HasInfo BinaryCodec e ) => HasInfo BinaryCodec (a, b, c, d, e) where info :: Proxy BinaryCodec -> Proxy (a, b, c, d, e) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (a, b, c, d, e) _ :: Proxy (a, b, c, d, e)) = [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) , Proxy BinaryCodec -> Proxy c -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy c forall {k} (t :: k). Proxy t Proxy :: Proxy c) , Proxy BinaryCodec -> Proxy d -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy d forall {k} (t :: k). Proxy t Proxy :: Proxy d) , Proxy BinaryCodec -> Proxy e -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy e forall {k} (t :: k). Proxy t Proxy :: Proxy e) ] instance ( HasInfo BinaryCodec a , HasInfo BinaryCodec b , HasInfo BinaryCodec c , HasInfo BinaryCodec d , HasInfo BinaryCodec e , HasInfo BinaryCodec f ) => HasInfo BinaryCodec (a, b, c, d, e, f) where info :: Proxy BinaryCodec -> Proxy (a, b, c, d, e, f) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (a, b, c, d, e, f) _ :: Proxy (a, b, c, d, e, f)) = [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) , Proxy BinaryCodec -> Proxy c -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy c forall {k} (t :: k). Proxy t Proxy :: Proxy c) , Proxy BinaryCodec -> Proxy d -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy d forall {k} (t :: k). Proxy t Proxy :: Proxy d) , Proxy BinaryCodec -> Proxy e -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy e forall {k} (t :: k). Proxy t Proxy :: Proxy e) , Proxy BinaryCodec -> Proxy f -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy f forall {k} (t :: k). Proxy t Proxy :: Proxy f) ] instance ( HasInfo BinaryCodec a , HasInfo BinaryCodec b , HasInfo BinaryCodec c , HasInfo BinaryCodec d , HasInfo BinaryCodec e , HasInfo BinaryCodec f , HasInfo BinaryCodec g ) => HasInfo BinaryCodec (a, b, c, d, e, f, g) where info :: Proxy BinaryCodec -> Proxy (a, b, c, d, e, f, g) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (a, b, c, d, e, f, g) _ :: Proxy (a, b, c, d, e, f, g)) = [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) , Proxy BinaryCodec -> Proxy c -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy c forall {k} (t :: k). Proxy t Proxy :: Proxy c) , Proxy BinaryCodec -> Proxy d -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy d forall {k} (t :: k). Proxy t Proxy :: Proxy d) , Proxy BinaryCodec -> Proxy e -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy e forall {k} (t :: k). Proxy t Proxy :: Proxy e) , Proxy BinaryCodec -> Proxy f -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy f forall {k} (t :: k). Proxy t Proxy :: Proxy f) , Proxy BinaryCodec -> Proxy g -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy g forall {k} (t :: k). Proxy t Proxy :: Proxy g) ] instance ( HasInfo BinaryCodec a , HasInfo BinaryCodec b , HasInfo BinaryCodec c , HasInfo BinaryCodec d , HasInfo BinaryCodec e , HasInfo BinaryCodec f , HasInfo BinaryCodec g , HasInfo BinaryCodec h ) => HasInfo BinaryCodec (a, b, c, d, e, f, g, h) where info :: Proxy BinaryCodec -> Proxy (a, b, c, d, e, f, g, h) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (a, b, c, d, e, f, g, h) _ :: Proxy (a, b, c, d, e, f, g, h)) = [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) , Proxy BinaryCodec -> Proxy c -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy c forall {k} (t :: k). Proxy t Proxy :: Proxy c) , Proxy BinaryCodec -> Proxy d -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy d forall {k} (t :: k). Proxy t Proxy :: Proxy d) , Proxy BinaryCodec -> Proxy e -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy e forall {k} (t :: k). Proxy t Proxy :: Proxy e) , Proxy BinaryCodec -> Proxy f -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy f forall {k} (t :: k). Proxy t Proxy :: Proxy f) , Proxy BinaryCodec -> Proxy g -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy g forall {k} (t :: k). Proxy t Proxy :: Proxy g) , Proxy BinaryCodec -> Proxy h -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy h forall {k} (t :: k). Proxy t Proxy :: Proxy h) ] instance ( HasInfo BinaryCodec a , HasInfo BinaryCodec b , HasInfo BinaryCodec c , HasInfo BinaryCodec d , HasInfo BinaryCodec e , HasInfo BinaryCodec f , HasInfo BinaryCodec g , HasInfo BinaryCodec h , HasInfo BinaryCodec i ) => HasInfo BinaryCodec (a, b, c, d, e, f, g, h, i) where info :: Proxy BinaryCodec -> Proxy (a, b, c, d, e, f, g, h, i) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (a, b, c, d, e, f, g, h, i) _ :: Proxy (a, b, c, d, e, f, g, h, i)) = [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) , Proxy BinaryCodec -> Proxy c -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy c forall {k} (t :: k). Proxy t Proxy :: Proxy c) , Proxy BinaryCodec -> Proxy d -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy d forall {k} (t :: k). Proxy t Proxy :: Proxy d) , Proxy BinaryCodec -> Proxy e -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy e forall {k} (t :: k). Proxy t Proxy :: Proxy e) , Proxy BinaryCodec -> Proxy f -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy f forall {k} (t :: k). Proxy t Proxy :: Proxy f) , Proxy BinaryCodec -> Proxy g -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy g forall {k} (t :: k). Proxy t Proxy :: Proxy g) , Proxy BinaryCodec -> Proxy h -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy h forall {k} (t :: k). Proxy t Proxy :: Proxy h) , Proxy BinaryCodec -> Proxy i -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy i forall {k} (t :: k). Proxy t Proxy :: Proxy i) ] instance ( HasInfo BinaryCodec a , HasInfo BinaryCodec b , HasInfo BinaryCodec c , HasInfo BinaryCodec d , HasInfo BinaryCodec e , HasInfo BinaryCodec f , HasInfo BinaryCodec g , HasInfo BinaryCodec h , HasInfo BinaryCodec i , HasInfo BinaryCodec j ) => HasInfo BinaryCodec (a, b, c, d, e, f, g, h, i, j) where info :: Proxy BinaryCodec -> Proxy (a, b, c, d, e, f, g, h, i, j) -> FieldInfo BinaryCodec info Proxy BinaryCodec codec (Proxy (a, b, c, d, e, f, g, h, i, j) _ :: Proxy (a, b, c, d, e, f, g, h, i, j)) = [FieldInfo BinaryCodec] -> FieldInfo BinaryCodec forall codec. [FieldInfo codec] -> FieldInfo codec tupleInfo [ Proxy BinaryCodec -> Proxy a -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy a forall {k} (t :: k). Proxy t Proxy :: Proxy a) , Proxy BinaryCodec -> Proxy b -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy b forall {k} (t :: k). Proxy t Proxy :: Proxy b) , Proxy BinaryCodec -> Proxy c -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy c forall {k} (t :: k). Proxy t Proxy :: Proxy c) , Proxy BinaryCodec -> Proxy d -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy d forall {k} (t :: k). Proxy t Proxy :: Proxy d) , Proxy BinaryCodec -> Proxy e -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy e forall {k} (t :: k). Proxy t Proxy :: Proxy e) , Proxy BinaryCodec -> Proxy f -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy f forall {k} (t :: k). Proxy t Proxy :: Proxy f) , Proxy BinaryCodec -> Proxy g -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy g forall {k} (t :: k). Proxy t Proxy :: Proxy g) , Proxy BinaryCodec -> Proxy h -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy h forall {k} (t :: k). Proxy t Proxy :: Proxy h) , Proxy BinaryCodec -> Proxy i -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy i forall {k} (t :: k). Proxy t Proxy :: Proxy i) , Proxy BinaryCodec -> Proxy j -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy j forall {k} (t :: k). Proxy t Proxy :: Proxy j) ] instance HasInfo BinaryCodec ByteString where info :: Proxy BinaryCodec -> Proxy ByteString -> FieldInfo BinaryCodec info Proxy BinaryCodec codec Proxy ByteString _ = String -> [(String, FieldInfo BinaryCodec)] -> FieldInfo BinaryCodec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String "List" [ (String "length", Proxy BinaryCodec -> Proxy Int -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Int forall {k} (t :: k). Proxy t Proxy :: Proxy Int)) , (String "items", FieldSize -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall codec. FieldSize -> FieldInfo codec -> FieldInfo codec listField (String -> FieldSize VarSize String "length") (Proxy BinaryCodec -> Proxy Word8 -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Word8 forall {k} (t :: k). Proxy t Proxy :: Proxy Word8))) ] deriving via (ViaBinary ByteString) instance Serializable BinaryCodec ByteString instance HasInfo BinaryCodec LBS.ByteString where info :: Proxy BinaryCodec -> Proxy ByteString -> FieldInfo BinaryCodec info Proxy BinaryCodec codec Proxy ByteString _ = String -> [(String, FieldInfo BinaryCodec)] -> FieldInfo BinaryCodec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String "List" [ (String "length", Proxy BinaryCodec -> Proxy Int -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Int forall {k} (t :: k). Proxy t Proxy :: Proxy Int)) , (String "items", FieldSize -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall codec. FieldSize -> FieldInfo codec -> FieldInfo codec listField (String -> FieldSize VarSize String "length") (Proxy BinaryCodec -> Proxy Word8 -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Word8 forall {k} (t :: k). Proxy t Proxy :: Proxy Word8))) ] deriving via (ViaBinary LBS.ByteString) instance Serializable BinaryCodec LBS.ByteString instance HasInfo BinaryCodec ShortByteString where info :: Proxy BinaryCodec -> Proxy ShortByteString -> FieldInfo BinaryCodec info Proxy BinaryCodec codec Proxy ShortByteString _ = String -> [(String, FieldInfo BinaryCodec)] -> FieldInfo BinaryCodec forall codec. String -> [(String, FieldInfo codec)] -> FieldInfo codec compoundField String "List" [ (String "length", Proxy BinaryCodec -> Proxy Int -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Int forall {k} (t :: k). Proxy t Proxy :: Proxy Int)) , (String "items", FieldSize -> FieldInfo BinaryCodec -> FieldInfo BinaryCodec forall codec. FieldSize -> FieldInfo codec -> FieldInfo codec listField (String -> FieldSize VarSize String "length") (Proxy BinaryCodec -> Proxy Word8 -> FieldInfo BinaryCodec forall codec a. HasInfo codec a => Proxy codec -> Proxy a -> FieldInfo codec info Proxy BinaryCodec codec (Proxy Word8 forall {k} (t :: k). Proxy t Proxy :: Proxy Word8))) ] deriving via (ViaBinary ShortByteString) instance Serializable BinaryCodec ShortByteString