module Binrep.Generic
( Cfg(..), cfg
, cSumTagHex, cSumTagNullTerm, cDef
, cNoSum, EDerivedSumInstanceWithNonSumCfg(..)
, blenGeneric, putGeneric, getGeneric, CBLenGeneric
) where
import Binrep.Generic.Internal
import Binrep.Generic.BLen
import Binrep.Generic.Put
import Binrep.Generic.Get
import Binrep.Generic.CBLen
import Binrep.Type.ByteString ( AsByteString, Rep(..) )
import Refined.Unsafe ( reallyUnsafeRefine )
import Data.Text qualified as Text
import Data.Text.Encoding qualified as Text
import Numeric ( readHex )
import Data.Void ( Void )
import Control.Exception ( Exception, throw )
import Binrep.Util ( tshow )
cfg :: (Eq a, Show a) => (String -> a) -> Cfg a
cfg :: forall a. (Eq a, Show a) => (String -> a) -> Cfg a
cfg String -> a
f = Cfg { cSumTag :: String -> a
cSumTag = String -> a
f, cSumTagEq :: a -> a -> Bool
cSumTagEq = forall a. Eq a => a -> a -> Bool
(==), cSumTagShow :: a -> Text
cSumTagShow = forall a. Show a => a -> Text
tshow }
cSumTagHex :: forall a. Integral a => (String -> String) -> String -> a
cSumTagHex :: forall a. Integral a => (String -> String) -> String -> a
cSumTagHex String -> String
f = forall a. [(a, String)] -> a
forceRead forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Eq a, Num a) => ReadS a
readHex forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
f
forceRead :: [(a, String)] -> a
forceRead :: forall a. [(a, String)] -> a
forceRead = \case [] -> forall a. HasCallStack => String -> a
error String
"no parse"
[(a
x, String
"")] -> a
x
[(a
_x, String
_)] -> forall a. HasCallStack => String -> a
error String
"incomplete parse"
((a, String)
_:[(a, String)]
_) -> forall a. HasCallStack => String -> a
error String
"too many parses (how??)"
cSumTagNullTerm :: String -> AsByteString 'C
cSumTagNullTerm :: String -> AsByteString 'C
cSumTagNullTerm = forall {k} x (p :: k). x -> Refined p x
reallyUnsafeRefine forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> ByteString
Text.encodeUtf8 forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
Text.pack
cDef :: Cfg (AsByteString 'C)
cDef :: Cfg (AsByteString 'C)
cDef = forall a. (Eq a, Show a) => (String -> a) -> Cfg a
cfg String -> AsByteString 'C
cSumTagNullTerm
cNoSum :: Cfg Void
cNoSum :: Cfg Void
cNoSum = forall a. (Eq a, Show a) => (String -> a) -> Cfg a
cfg forall a b. (a -> b) -> a -> b
$ \String
_ -> forall a e. Exception e => e -> a
throw EDerivedSumInstanceWithNonSumCfg
EDerivedSumInstanceWithNonSumCfg
data EDerivedSumInstanceWithNonSumCfg = EDerivedSumInstanceWithNonSumCfg
instance Show EDerivedSumInstanceWithNonSumCfg where
show :: EDerivedSumInstanceWithNonSumCfg -> String
show EDerivedSumInstanceWithNonSumCfg
EDerivedSumInstanceWithNonSumCfg =
String
"Binrep.Generic.cNoSum: non-sum generic derivation configuration used with a sum type"
instance Exception EDerivedSumInstanceWithNonSumCfg