module Bytezap.Write.Internal where
import Bytezap.Poke ( Poke )
data Write (lt :: LengthType) s = Write
{ forall (lt :: LengthType) s. Write lt s -> Int
writeLength :: Int
, forall (lt :: LengthType) s. Write lt s -> Poke s
writeOp :: Poke s
}
data LengthType
= ExactLength
| MaxLength
instance Semigroup (Write lt s) where
<> :: Write lt s -> Write lt s -> Write lt s
(<>) = Write lt s -> Write lt s -> Write lt s
forall (ltl :: LengthType) s (ltr :: LengthType)
(lt :: LengthType).
Write ltl s -> Write ltr s -> Write lt s
writeCombine
instance Monoid (Write lt s) where
mempty :: Write lt s
mempty = Int -> Poke s -> Write lt s
forall (lt :: LengthType) s. Int -> Poke s -> Write lt s
Write Int
0 Poke s
forall a. Monoid a => a
mempty
writeMax :: Write ExactLength s -> Write MaxLength s
writeMax :: forall s. Write 'ExactLength s -> Write 'MaxLength s
writeMax (Write Int
l Poke s
p) = Int -> Poke s -> Write 'MaxLength s
forall (lt :: LengthType) s. Int -> Poke s -> Write lt s
Write Int
l Poke s
p
writeMaxExact :: Write MaxLength s -> Write ExactLength s -> Write MaxLength s
writeMaxExact :: forall s.
Write 'MaxLength s -> Write 'ExactLength s -> Write 'MaxLength s
writeMaxExact = Write 'MaxLength s -> Write 'ExactLength s -> Write 'MaxLength s
forall (ltl :: LengthType) s (ltr :: LengthType)
(lt :: LengthType).
Write ltl s -> Write ltr s -> Write lt s
writeCombine
writeExactMax :: Write ExactLength s -> Write MaxLength s -> Write MaxLength s
writeExactMax :: forall s.
Write 'ExactLength s -> Write 'MaxLength s -> Write 'MaxLength s
writeExactMax = Write 'ExactLength s -> Write 'MaxLength s -> Write 'MaxLength s
forall (ltl :: LengthType) s (ltr :: LengthType)
(lt :: LengthType).
Write ltl s -> Write ltr s -> Write lt s
writeCombine
writeCombine :: Write ltl s -> Write ltr s -> Write lt s
writeCombine :: forall (ltl :: LengthType) s (ltr :: LengthType)
(lt :: LengthType).
Write ltl s -> Write ltr s -> Write lt s
writeCombine (Write Int
ll Poke s
lp) (Write Int
rl Poke s
rp) = Int -> Poke s -> Write lt s
forall (lt :: LengthType) s. Int -> Poke s -> Write lt s
Write (Int
ll Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
rl) (Poke s
lp Poke s -> Poke s -> Poke s
forall a. Semigroup a => a -> a -> a
<> Poke s
rp)