packages feed

dahdit 0.7.0 → 0.8.0

raw patch · 15 files changed

+514/−824 lines, 15 filesdep +primitive-unalignedPVP ok

version bump matches the API change (PVP)

Dependencies added: primitive-unaligned

API changes (from Hackage documentation)

- Dahdit: getLiftedPrimArray :: LiftedPrim a => Proxy a -> ElemCount -> Get (LiftedPrimArray a)
- Dahdit: getRemainingLiftedPrimArray :: LiftedPrim a => Proxy a -> Get (LiftedPrimArray a)
- Dahdit: putLiftedPrimArray :: LiftedPrimArray a -> Put
- Dahdit.Fancy: instance (GHC.TypeNats.KnownNat n, Dahdit.LiftedPrim.LiftedPrim a, Data.Default.Class.Default a) => Dahdit.Binary.Binary (Dahdit.Fancy.StaticArray n a)
- Dahdit.Fancy: instance (GHC.TypeNats.KnownNat n, Dahdit.LiftedPrim.LiftedPrim a, Data.Default.Class.Default a) => Data.Default.Class.Default (Dahdit.Fancy.StaticArray n a)
- Dahdit.Fancy: instance GHC.Classes.Eq (Dahdit.Fancy.StaticArray n a)
- Dahdit.Fancy: instance GHC.Show.Show (Dahdit.Fancy.StaticArray n a)
- Dahdit.Funs: getLiftedPrimArray :: LiftedPrim a => Proxy a -> ElemCount -> Get (LiftedPrimArray a)
- Dahdit.Funs: getRemainingLiftedPrimArray :: LiftedPrim a => Proxy a -> Get (LiftedPrimArray a)
- Dahdit.Funs: putLiftedPrimArray :: LiftedPrimArray a -> Put
- Dahdit.Internal: ViaEndianPair :: be -> ViaEndianPair (n :: Nat) le be
- Dahdit.Internal: ViaFromIntegral :: y -> ViaFromIntegral (n :: Nat) x y
- Dahdit.Internal: [unViaEndianPair] :: ViaEndianPair (n :: Nat) le be -> be
- Dahdit.Internal: [unViaFromIntegral] :: ViaFromIntegral (n :: Nat) x y -> y
- Dahdit.Internal: class (Num le, Num be) => EndianPair (n :: Nat) le be | le -> n, be -> n, le -> be, be -> le
- Dahdit.Internal: class (Num w) => SwapEndian w
- Dahdit.Internal: instance (Dahdit.Internal.SwapEndian x, GHC.Real.Integral x, GHC.Real.Integral y) => Dahdit.Internal.SwapEndian (Dahdit.Internal.ViaFromIntegral n x y)
- Dahdit.Internal: instance Dahdit.Internal.EndianPair 1 GHC.Int.Int8 GHC.Int.Int8
- Dahdit.Internal: instance Dahdit.Internal.EndianPair 1 GHC.Word.Word8 GHC.Word.Word8
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian Data.ShortWord.Int24
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian Data.ShortWord.Word24
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Int.Int16
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Int.Int32
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Int.Int64
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Int.Int8
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Types.Double
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Types.Float
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Word.Word16
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Word.Word32
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Word.Word64
- Dahdit.Internal: instance Dahdit.Internal.SwapEndian GHC.Word.Word8
- Dahdit.Internal: instance GHC.Num.Num y => GHC.Num.Num (Dahdit.Internal.ViaFromIntegral n x y)
- Dahdit.Internal: mkDoubleLE :: Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Double
- Dahdit.Internal: mkFloatLE :: Word8 -> Word8 -> Word8 -> Word8 -> Float
- Dahdit.Internal: mkWord16LE :: Word8 -> Word8 -> Word16
- Dahdit.Internal: mkWord24LE :: Word8 -> Word8 -> Word8 -> Word24
- Dahdit.Internal: mkWord32LE :: Word8 -> Word8 -> Word8 -> Word8 -> Word32
- Dahdit.Internal: mkWord64LE :: Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word64
- Dahdit.Internal: newtype ViaEndianPair (n :: Nat) le be
- Dahdit.Internal: newtype ViaFromIntegral (n :: Nat) x y
- Dahdit.Internal: swapEndian :: SwapEndian w => w -> w
- Dahdit.Internal: toBigEndian :: EndianPair n le be => le -> be
- Dahdit.Internal: toLittleEndian :: EndianPair n le be => be -> le
- Dahdit.Internal: unMkDoubleLE :: Double -> (Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8)
- Dahdit.Internal: unMkFloatLE :: Float -> (Word8, Word8, Word8, Word8)
- Dahdit.Internal: unMkWord16LE :: Word16 -> (Word8, Word8)
- Dahdit.Internal: unMkWord24LE :: Word24 -> (Word8, Word8, Word8)
- Dahdit.Internal: unMkWord32LE :: Word32 -> (Word8, Word8, Word8, Word8)
- Dahdit.Internal: unMkWord64LE :: Word64 -> (Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8)
- Dahdit.LiftedPrim: class (StaticByteSized a) => LiftedPrim a
- Dahdit.LiftedPrim: indexArrayLiftedInBytes :: LiftedPrim a => ByteArray -> ByteCount -> a
- Dahdit.LiftedPrim: indexArrayLiftedInElems :: LiftedPrim a => Proxy a -> ByteArray -> ElemCount -> a
- Dahdit.LiftedPrim: indexPtrLiftedInBytes :: LiftedPrim a => Ptr Word8 -> ByteCount -> a
- Dahdit.LiftedPrim: indexPtrLiftedInElems :: LiftedPrim a => Proxy a -> Ptr Word8 -> ElemCount -> a
- Dahdit.LiftedPrim: instance (Dahdit.LiftedPrim.LiftedPrim le, Dahdit.Internal.EndianPair n le be, n GHC.Types.~ Dahdit.Sizes.StaticSize le) => Dahdit.LiftedPrim.LiftedPrim (Dahdit.Internal.ViaEndianPair n le be)
- Dahdit.LiftedPrim: instance (GHC.Real.Integral x, Dahdit.LiftedPrim.LiftedPrim x, GHC.Real.Integral y, n GHC.Types.~ Dahdit.Sizes.StaticSize x) => Dahdit.LiftedPrim.LiftedPrim (Dahdit.Internal.ViaFromIntegral n x y)
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.DoubleBE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.DoubleLE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.FloatBE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.FloatLE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Int16BE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Int16LE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Int24BE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Int24LE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Int32BE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Int32LE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Int64BE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Int64LE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Word16BE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Word16LE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Word24BE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Word24LE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Word32BE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Word32LE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Word64BE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim Dahdit.Nums.Word64LE
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim GHC.Int.Int8
- Dahdit.LiftedPrim: instance Dahdit.LiftedPrim.LiftedPrim GHC.Word.Word8
- Dahdit.LiftedPrim: setByteArrayLifted :: (PrimMonad m, LiftedPrim a) => MutableByteArray (PrimState m) -> ByteCount -> ByteCount -> a -> m ()
- Dahdit.LiftedPrim: writeArrayLiftedInBytes :: (LiftedPrim a, PrimMonad m) => MutableByteArray (PrimState m) -> ByteCount -> a -> m ()
- Dahdit.LiftedPrim: writeArrayLiftedInElems :: (PrimMonad m, LiftedPrim a) => MutableByteArray (PrimState m) -> ElemCount -> a -> m ()
- Dahdit.LiftedPrim: writePtrLiftedInBytes :: (LiftedPrim a, PrimMonad m) => Ptr Word8 -> ByteCount -> a -> m ()
- Dahdit.LiftedPrim: writePtrLiftedInElems :: (PrimMonad m, LiftedPrim a) => Ptr Word8 -> ElemCount -> a -> m ()
- Dahdit.LiftedPrimArray: LiftedPrimArray :: ByteArray -> LiftedPrimArray a
- Dahdit.LiftedPrimArray: MutableLiftedPrimArray :: MutableByteArray m -> MutableLiftedPrimArray m a
- Dahdit.LiftedPrimArray: [unLiftedPrimArray] :: LiftedPrimArray a -> ByteArray
- Dahdit.LiftedPrimArray: [unMutableLiftedPrimArray] :: MutableLiftedPrimArray m a -> MutableByteArray m
- Dahdit.LiftedPrimArray: cloneLiftedPrimArray :: LiftedPrim a => LiftedPrimArray a -> ElemCount -> ElemCount -> LiftedPrimArray a
- Dahdit.LiftedPrimArray: emptyLiftedPrimArray :: LiftedPrimArray a
- Dahdit.LiftedPrimArray: freezeLiftedPrimArray :: PrimMonad m => MutableLiftedPrimArray (PrimState m) a -> ElemCount -> ElemCount -> m (LiftedPrimArray a)
- Dahdit.LiftedPrimArray: generateLiftedPrimArray :: LiftedPrim a => ElemCount -> (ElemCount -> a) -> LiftedPrimArray a
- Dahdit.LiftedPrimArray: indexLiftedPrimArray :: LiftedPrim a => LiftedPrimArray a -> ElemCount -> a
- Dahdit.LiftedPrimArray: instance Data.Default.Class.Default (Dahdit.LiftedPrimArray.LiftedPrimArray a)
- Dahdit.LiftedPrimArray: instance GHC.Base.Monoid (Dahdit.LiftedPrimArray.LiftedPrimArray a)
- Dahdit.LiftedPrimArray: instance GHC.Base.Semigroup (Dahdit.LiftedPrimArray.LiftedPrimArray a)
- Dahdit.LiftedPrimArray: instance GHC.Classes.Eq (Dahdit.LiftedPrimArray.LiftedPrimArray a)
- Dahdit.LiftedPrimArray: instance GHC.Classes.Eq (Dahdit.LiftedPrimArray.MutableLiftedPrimArray m a)
- Dahdit.LiftedPrimArray: instance GHC.Classes.Ord (Dahdit.LiftedPrimArray.LiftedPrimArray a)
- Dahdit.LiftedPrimArray: instance GHC.Show.Show (Dahdit.LiftedPrimArray.LiftedPrimArray a)
- Dahdit.LiftedPrimArray: lengthLiftedPrimArray :: LiftedPrim a => LiftedPrimArray a -> ElemCount
- Dahdit.LiftedPrimArray: liftedPrimArrayFromList :: LiftedPrim a => [a] -> LiftedPrimArray a
- Dahdit.LiftedPrimArray: liftedPrimArrayFromListN :: LiftedPrim a => ElemCount -> [a] -> LiftedPrimArray a
- Dahdit.LiftedPrimArray: newtype LiftedPrimArray a
- Dahdit.LiftedPrimArray: newtype MutableLiftedPrimArray m a
- Dahdit.LiftedPrimArray: replicateLiftedPrimArray :: LiftedPrim a => ElemCount -> a -> LiftedPrimArray a
- Dahdit.LiftedPrimArray: sizeofLiftedPrimArray :: LiftedPrimArray a -> ByteCount
- Dahdit.LiftedPrimArray: thawLiftedPrimArray :: PrimMonad m => LiftedPrimArray a -> ElemCount -> ElemCount -> m (MutableLiftedPrimArray (PrimState m) a)
- Dahdit.LiftedPrimArray: unsafeFreezeLiftedPrimArray :: PrimMonad m => MutableLiftedPrimArray (PrimState m) a -> m (LiftedPrimArray a)
- Dahdit.LiftedPrimArray: unsafeThawLiftedPrimArray :: PrimMonad m => LiftedPrimArray a -> m (MutableLiftedPrimArray (PrimState m) a)
- Dahdit.LiftedPrimArray: writeLiftedPrimArray :: (LiftedPrim a, PrimMonad m) => MutableLiftedPrimArray (PrimState m) a -> ElemCount -> a -> m ()
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 2 Dahdit.Nums.Int16LE Dahdit.Nums.Int16BE
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 2 Dahdit.Nums.Word16LE Dahdit.Nums.Word16BE
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 3 Dahdit.Nums.Int24LE Dahdit.Nums.Int24BE
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 3 Dahdit.Nums.Word24LE Dahdit.Nums.Word24BE
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 4 Dahdit.Nums.FloatLE Dahdit.Nums.FloatBE
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 4 Dahdit.Nums.Int32LE Dahdit.Nums.Int32BE
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 4 Dahdit.Nums.Word32LE Dahdit.Nums.Word32BE
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 8 Dahdit.Nums.DoubleLE Dahdit.Nums.DoubleBE
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 8 Dahdit.Nums.Int64LE Dahdit.Nums.Int64BE
- Dahdit.Nums: instance Dahdit.Internal.EndianPair 8 Dahdit.Nums.Word64LE Dahdit.Nums.Word64BE
- Dahdit.Sizes: instance (Dahdit.Sizes.StaticByteSized le, n GHC.Types.~ Dahdit.Sizes.StaticSize le) => Dahdit.Sizes.StaticByteSized (Dahdit.Internal.ViaEndianPair n le be)
- Dahdit.Sizes: instance (Dahdit.Sizes.StaticByteSized x, n GHC.Types.~ Dahdit.Sizes.StaticSize x) => Dahdit.Sizes.StaticByteSized (Dahdit.Internal.ViaFromIntegral n x y)
+ Dahdit: class () => Prim a
+ Dahdit: data () => PrimArray a
+ Dahdit: getPrimArray :: StaticByteSized a => Proxy a -> ElemCount -> Get (PrimArray a)
+ Dahdit: getRemainingPrimArray :: StaticByteSized a => Proxy a -> Get (PrimArray a)
+ Dahdit: putPrimArray :: PrimArray a -> Put
+ Dahdit.Fancy: instance (GHC.Classes.Eq a, Data.Primitive.Types.Prim a) => GHC.Classes.Eq (Dahdit.Fancy.StaticArray n a)
+ Dahdit.Fancy: instance (GHC.Show.Show a, Data.Primitive.Types.Prim a) => GHC.Show.Show (Dahdit.Fancy.StaticArray n a)
+ Dahdit.Fancy: instance (GHC.TypeNats.KnownNat n, Data.Primitive.Types.Prim a, Data.Default.Class.Default a) => Data.Default.Class.Default (Dahdit.Fancy.StaticArray n a)
+ Dahdit.Fancy: instance (GHC.TypeNats.KnownNat n, Data.Primitive.Types.Prim a, Data.Primitive.ByteArray.Unaligned.PrimUnaligned a, Dahdit.Sizes.StaticByteSized a, Data.Default.Class.Default a) => Dahdit.Binary.Binary (Dahdit.Fancy.StaticArray n a)
+ Dahdit.Funs: getPrimArray :: StaticByteSized a => Proxy a -> ElemCount -> Get (PrimArray a)
+ Dahdit.Funs: getRemainingPrimArray :: StaticByteSized a => Proxy a -> Get (PrimArray a)
+ Dahdit.Funs: putPrimArray :: PrimArray a -> Put
+ Dahdit.Nums: instance (Data.Primitive.ByteArray.Unaligned.PrimUnaligned x, Dahdit.Nums.SwapEndian x le be) => Data.Primitive.ByteArray.Unaligned.PrimUnaligned (Dahdit.Nums.ViaSwapEndian x be)
+ Dahdit.Nums: instance (Data.Primitive.Types.Prim x, Dahdit.Nums.SwapEndian x le be) => Data.Primitive.Types.Prim (Dahdit.Nums.ViaSwapEndian x be)
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian Data.ShortWord.Int24 Dahdit.Nums.Int24LE Dahdit.Nums.Int24BE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian Data.ShortWord.Word24 Dahdit.Nums.Word24LE Dahdit.Nums.Word24BE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Int.Int16 Dahdit.Nums.Int16LE Dahdit.Nums.Int16BE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Int.Int32 Dahdit.Nums.Int32LE Dahdit.Nums.Int32BE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Int.Int64 Dahdit.Nums.Int64LE Dahdit.Nums.Int64BE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Int.Int8 GHC.Int.Int8 GHC.Int.Int8
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Types.Double Dahdit.Nums.DoubleLE Dahdit.Nums.DoubleBE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Types.Float Dahdit.Nums.FloatLE Dahdit.Nums.FloatBE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Word.Word16 Dahdit.Nums.Word16LE Dahdit.Nums.Word16BE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Word.Word32 Dahdit.Nums.Word32LE Dahdit.Nums.Word32BE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Word.Word64 Dahdit.Nums.Word64LE Dahdit.Nums.Word64BE
+ Dahdit.Nums: instance Dahdit.Nums.SwapEndian GHC.Word.Word8 GHC.Word.Word8 GHC.Word.Word8
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.DoubleBE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.DoubleLE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.FloatBE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.FloatLE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Int16BE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Int16LE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Int24BE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Int24LE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Int32BE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Int32LE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Int64BE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Int64LE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Word16BE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Word16LE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Word24BE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Word24LE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Word32BE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Word32LE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Word64BE
+ Dahdit.Nums: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Dahdit.Nums.Word64LE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.DoubleBE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.DoubleLE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.FloatBE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.FloatLE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Int16BE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Int16LE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Int24BE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Int24LE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Int32BE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Int32LE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Int64BE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Int64LE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Word16BE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Word16LE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Word24BE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Word24LE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Word32BE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Word32LE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Word64BE
+ Dahdit.Nums: instance Data.Primitive.Types.Prim Dahdit.Nums.Word64LE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Int16BE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Int16LE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Int24BE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Int24LE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Int32BE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Int32LE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Int64BE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Int64LE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Word16BE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Word16LE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Word24BE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Word24LE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Word32BE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Word32LE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Word64BE
+ Dahdit.Nums: instance GHC.Bits.FiniteBits Dahdit.Nums.Word64LE
+ Dahdit.ShortWord: instance Data.Default.Class.Default Data.ShortWord.Int24
+ Dahdit.ShortWord: instance Data.Default.Class.Default Data.ShortWord.Word24
+ Dahdit.ShortWord: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Data.ShortWord.Int24
+ Dahdit.ShortWord: instance Data.Primitive.ByteArray.Unaligned.PrimUnaligned Data.ShortWord.Word24
+ Dahdit.ShortWord: instance Data.Primitive.Types.Prim Data.ShortWord.Int24
+ Dahdit.ShortWord: instance Data.Primitive.Types.Prim Data.ShortWord.Word24
+ Dahdit.Sizes: instance GHC.Enum.Bounded Dahdit.Sizes.ByteCount
+ Dahdit.Sizes: instance GHC.Enum.Bounded Dahdit.Sizes.ElemCount
+ Dahdit.Sizes: primByteSize :: Prim a => a -> ByteCount
+ Dahdit.Sizes: primByteSizeOf :: forall a. Prim a => Proxy a -> ByteCount
- Dahdit: getRemainingStaticArray :: LiftedPrim a => Proxy a -> Get (LiftedPrimArray a)
+ Dahdit: getRemainingStaticArray :: forall a. (Prim a, PrimUnaligned a) => Proxy a -> Get (PrimArray a)
- Dahdit: getStaticArray :: LiftedPrim a => ElemCount -> Get (LiftedPrimArray a)
+ Dahdit: getStaticArray :: (Prim a, PrimUnaligned a) => ElemCount -> Get (PrimArray a)
- Dahdit: putStaticArray :: LiftedPrim a => LiftedPrimArray a -> Put
+ Dahdit: putStaticArray :: (Prim a, PrimUnaligned a) => PrimArray a -> Put
- Dahdit.Fancy: StaticArray :: LiftedPrimArray a -> StaticArray (n :: Nat) a
+ Dahdit.Fancy: StaticArray :: PrimArray a -> StaticArray (n :: Nat) a
- Dahdit.Fancy: [unStaticArray] :: StaticArray (n :: Nat) a -> LiftedPrimArray a
+ Dahdit.Fancy: [unStaticArray] :: StaticArray (n :: Nat) a -> PrimArray a
- Dahdit.Free: [GetStaticArrayF] :: LiftedPrim z => !ElemCount -> Proxy z -> (LiftedPrimArray z -> a) -> GetStaticArrayF a
+ Dahdit.Free: [GetStaticArrayF] :: (Prim z, PrimUnaligned z) => !ElemCount -> Proxy z -> (PrimArray z -> a) -> GetStaticArrayF a
- Dahdit.Free: [PutStaticArrayF] :: LiftedPrim z => !ElemCount -> !Maybe z -> !LiftedPrimArray z -> a -> PutStaticArrayF a
+ Dahdit.Free: [PutStaticArrayF] :: (Prim z, PrimUnaligned z) => !ElemCount -> !Maybe z -> !PrimArray z -> a -> PutStaticArrayF a
- Dahdit.Funs: getRemainingStaticArray :: LiftedPrim a => Proxy a -> Get (LiftedPrimArray a)
+ Dahdit.Funs: getRemainingStaticArray :: forall a. (Prim a, PrimUnaligned a) => Proxy a -> Get (PrimArray a)
- Dahdit.Funs: getStaticArray :: LiftedPrim a => ElemCount -> Get (LiftedPrimArray a)
+ Dahdit.Funs: getStaticArray :: (Prim a, PrimUnaligned a) => ElemCount -> Get (PrimArray a)
- Dahdit.Funs: putStaticArray :: LiftedPrim a => LiftedPrimArray a -> Put
+ Dahdit.Funs: putStaticArray :: (Prim a, PrimUnaligned a) => PrimArray a -> Put
- Dahdit.Funs: unsafePutStaticArrayN :: LiftedPrim a => ElemCount -> Maybe a -> LiftedPrimArray a -> Put
+ Dahdit.Funs: unsafePutStaticArrayN :: (Prim a, PrimUnaligned a) => ElemCount -> Maybe a -> PrimArray a -> Put
- Dahdit.Mem: indexMemInBytes :: (ReadMem r m, LiftedPrim a) => r -> ByteCount -> m a
+ Dahdit.Mem: indexMemInBytes :: (ReadMem r m, Prim a, PrimUnaligned a) => r -> ByteCount -> m a
- Dahdit.Mem: setMemInBytes :: (WriteMem q m, LiftedPrim a) => ByteCount -> a -> q (PrimState m) -> ByteCount -> m ()
+ Dahdit.Mem: setMemInBytes :: (WriteMem q m, Prim a, PrimUnaligned a) => ByteCount -> a -> q (PrimState m) -> ByteCount -> m ()
- Dahdit.Mem: writeMemInBytes :: (WriteMem q m, LiftedPrim a) => a -> q (PrimState m) -> ByteCount -> m ()
+ Dahdit.Mem: writeMemInBytes :: (WriteMem q m, Prim a, PrimUnaligned a) => a -> q (PrimState m) -> ByteCount -> m ()

Files

dahdit.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.37.0.+-- This file has been generated from package.yaml by hpack version 0.38.0. -- -- see: https://github.com/sol/hpack  name:           dahdit-version:        0.7.0+version:        0.8.0 synopsis:       Binary parsing and serialization with integrated size description:    Please see the README on GitHub at <https://github.com/ejconlon/dahdit#readme> category:       Data@@ -35,13 +35,11 @@       Dahdit.Funs       Dahdit.Generic       Dahdit.Iface-      Dahdit.Internal-      Dahdit.LiftedPrim-      Dahdit.LiftedPrimArray       Dahdit.Mem       Dahdit.Nums       Dahdit.Proxy       Dahdit.Run+      Dahdit.ShortWord       Dahdit.Sizes   other-modules:       Paths_dahdit@@ -84,6 +82,7 @@     , ghc-typelits-knownnat ==0.7.*     , mtl >=2.2 && <2.4     , primitive >=0.7 && <0.10+    , primitive-unaligned ==0.1.*     , text >=1.2 && <2.2     , transformers >=0.5 && <0.7     , vector >=0.12 && <0.14@@ -134,6 +133,7 @@     , ghc-typelits-knownnat ==0.7.*     , mtl >=2.2 && <2.4     , primitive >=0.7 && <0.10+    , primitive-unaligned ==0.1.*     , prop-unit >=1.0.1 && <1.1     , text >=1.2 && <2.2     , transformers >=0.5 && <0.7
src/Dahdit.hs view
@@ -7,6 +7,8 @@   , Seq (..)   , ByteArray   , Generic+  , Prim+  , PrimArray   , Proxy (..)   , GetError (..)   , prettyGetError@@ -20,8 +22,6 @@   , module Dahdit.Funs   , module Dahdit.Generic   , module Dahdit.Iface-  , module Dahdit.LiftedPrim-  , module Dahdit.LiftedPrimArray   , module Dahdit.Nums   , module Dahdit.Proxy   , module Dahdit.Sizes@@ -35,8 +35,6 @@ import Dahdit.Funs hiding (unsafePutStaticArrayN, unsafePutStaticSeqN) import Dahdit.Generic import Dahdit.Iface-import Dahdit.LiftedPrim-import Dahdit.LiftedPrimArray import Dahdit.Nums import Dahdit.Proxy import Dahdit.Run (GetError (..), GetIncCb, GetIncRequest (..), prettyGetError, runCount)@@ -44,7 +42,9 @@ import Data.ByteString (ByteString) import Data.ByteString.Short (ShortByteString) import Data.Int (Int8)+import Data.Primitive (Prim) import Data.Primitive.ByteArray (ByteArray)+import Data.Primitive.PrimArray (PrimArray) import Data.Proxy (Proxy (..)) import Data.Sequence (Seq (..)) import Data.Vector.Storable (Vector)
src/Dahdit/Binary.hs view
@@ -220,6 +220,8 @@   get = getDoubleBE   put = putDoubleBE +-- Assuming we are on little-endian arch...+ deriving via Word16LE instance Binary Word16  deriving via Int16LE instance Binary Int16
src/Dahdit/Fancy.hs view
@@ -30,8 +30,6 @@   , unsafePutStaticArrayN   , unsafePutStaticSeqN   )-import Dahdit.LiftedPrim (LiftedPrim)-import Dahdit.LiftedPrimArray (LiftedPrimArray, replicateLiftedPrimArray) import Dahdit.Proxy (proxyForNatF) import Dahdit.Sizes (ByteCount (..), StaticByteSized (..), byteSizeViaStatic) import Data.ByteString.Internal (c2w)@@ -39,7 +37,10 @@ import Data.ByteString.Short.Internal (ShortByteString (..)) import Data.Coerce (coerce) import Data.Default (Default (..))+import Data.Primitive (Prim) import Data.Primitive.ByteArray (ByteArray (..), byteArrayFromListN)+import Data.Primitive.ByteArray.Unaligned (PrimUnaligned)+import Data.Primitive.PrimArray (PrimArray, replicatePrimArray) import Data.Proxy (Proxy (..)) import Data.Sequence (Seq) import qualified Data.Sequence as Seq@@ -166,17 +167,17 @@   get = fmap StaticSeq (getStaticSeq (fromInteger (natVal (Proxy :: Proxy n))) get)   put = unsafePutStaticSeqN (fromInteger (natVal (Proxy :: Proxy n))) (Just def) put . unStaticSeq -newtype StaticArray (n :: Nat) a = StaticArray {unStaticArray :: LiftedPrimArray a}+newtype StaticArray (n :: Nat) a = StaticArray {unStaticArray :: PrimArray a}   deriving stock (Show)   deriving newtype (Eq) -instance (KnownNat n, LiftedPrim a, Default a) => Default (StaticArray n a) where-  def = StaticArray (replicateLiftedPrimArray (fromInteger (natVal (Proxy :: Proxy n))) def)+instance (KnownNat n, Prim a, Default a) => Default (StaticArray n a) where+  def = StaticArray (replicatePrimArray (fromInteger (natVal (Proxy :: Proxy n))) def)  instance (KnownNat n, StaticByteSized a) => StaticByteSized (StaticArray n a) where   type StaticSize (StaticArray n a) = n * StaticSize a -instance (KnownNat n, LiftedPrim a, Default a) => Binary (StaticArray n a) where+instance (KnownNat n, Prim a, PrimUnaligned a, StaticByteSized a, Default a) => Binary (StaticArray n a) where   byteSize = byteSizeViaStatic   get = fmap StaticArray (getStaticArray (fromInteger (natVal (Proxy :: Proxy n))))   put = unsafePutStaticArrayN (fromInteger (natVal (Proxy :: Proxy n))) (Just def) . unStaticArray
src/Dahdit/Free.hs view
@@ -16,8 +16,6 @@ where  import Control.Monad.Free.Church (F (..))-import Dahdit.LiftedPrim (LiftedPrim)-import Dahdit.LiftedPrimArray (LiftedPrimArray) import Dahdit.Nums   ( DoubleBE   , DoubleLE@@ -43,7 +41,10 @@ import Dahdit.Sizes (ByteCount, ElemCount, StaticByteSized (..)) import Data.ByteString.Short (ShortByteString) import Data.Int (Int8)-import Data.Primitive (ByteArray)+import Data.Primitive (Prim)+import Data.Primitive.ByteArray (ByteArray)+import Data.Primitive.ByteArray.Unaligned (PrimUnaligned)+import Data.Primitive.PrimArray (PrimArray) import Data.Proxy (Proxy (..)) import Data.Sequence (Seq) import Data.Text (Text)@@ -57,7 +58,7 @@   fmap f (GetStaticSeqF n g k) = GetStaticSeqF n g (f . k)  data GetStaticArrayF a where-  GetStaticArrayF :: (LiftedPrim z) => !ElemCount -> Proxy z -> (LiftedPrimArray z -> a) -> GetStaticArrayF a+  GetStaticArrayF :: (Prim z, PrimUnaligned z) => !ElemCount -> Proxy z -> (PrimArray z -> a) -> GetStaticArrayF a  instance Functor GetStaticArrayF where   fmap f (GetStaticArrayF n p k) = GetStaticArrayF n p (f . k)@@ -126,7 +127,7 @@   fmap f (PutStaticSeqF n z p s k) = PutStaticSeqF n z p s (f k)  data PutStaticArrayF a where-  PutStaticArrayF :: (LiftedPrim z) => !ElemCount -> !(Maybe z) -> !(LiftedPrimArray z) -> a -> PutStaticArrayF a+  PutStaticArrayF :: (Prim z, PrimUnaligned z) => !ElemCount -> !(Maybe z) -> !(PrimArray z) -> a -> PutStaticArrayF a  instance Functor PutStaticArrayF where   fmap f (PutStaticArrayF n z a k) = PutStaticArrayF n z a (f k)
src/Dahdit/Funs.hs view
@@ -31,7 +31,7 @@   , getStaticSeq   , getStaticArray   , getByteArray-  , getLiftedPrimArray+  , getPrimArray   , getExpect   , getLookAhead   , getRemainingSize@@ -40,7 +40,7 @@   , getRemainingStaticSeq   , getRemainingStaticArray   , getRemainingByteArray-  , getRemainingLiftedPrimArray+  , getRemainingPrimArray   , getUnfold   , putWord8   , putInt8@@ -74,7 +74,7 @@   , putStaticArray   , unsafePutStaticArrayN   , putByteArray-  , putLiftedPrimArray+  , putPrimArray   , putStaticHint   ) where@@ -96,8 +96,6 @@   , PutStaticSeqF (..)   , ScopeMode (..)   )-import Dahdit.LiftedPrim (LiftedPrim (..))-import Dahdit.LiftedPrimArray (LiftedPrimArray (..), lengthLiftedPrimArray) import Dahdit.Nums   ( DoubleBE   , DoubleLE@@ -127,8 +125,10 @@ import Data.Coerce (coerce) import Data.Foldable (traverse_) import Data.Int (Int8)-import Data.Primitive (sizeofByteArray)-import Data.Primitive.ByteArray (ByteArray)+import Data.Primitive (Prim, sizeOfType, sizeofByteArray)+import Data.Primitive.ByteArray (ByteArray (..))+import Data.Primitive.ByteArray.Unaligned (PrimUnaligned)+import Data.Primitive.PrimArray (PrimArray (..), sizeofPrimArray) import Data.Proxy (Proxy (..)) import Data.Sequence (Seq (..)) import qualified Data.Sequence as Seq@@ -244,16 +244,16 @@ getStaticSeq n g = Get (F (\x y -> y (GetFStaticSeq (GetStaticSeqF n g x))))  -- | Get PrimArray of statically-sized elements-getStaticArray :: (LiftedPrim a) => ElemCount -> Get (LiftedPrimArray a)+getStaticArray :: (Prim a, PrimUnaligned a) => ElemCount -> Get (PrimArray a) getStaticArray n = Get (F (\x y -> y (GetFStaticArray (GetStaticArrayF n (Proxy :: Proxy a) x))))  getByteArray :: ByteCount -> Get ByteArray getByteArray bc = Get (F (\x y -> y (GetFByteArray bc x))) -getLiftedPrimArray :: (LiftedPrim a) => Proxy a -> ElemCount -> Get (LiftedPrimArray a)-getLiftedPrimArray prox ec =+getPrimArray :: (StaticByteSized a) => Proxy a -> ElemCount -> Get (PrimArray a)+getPrimArray prox ec =   let bc = staticByteSize prox * coerce ec-  in  fmap LiftedPrimArray (getByteArray bc)+  in  fmap (\(ByteArray a) -> PrimArray a) (getByteArray bc)  getLookAhead :: Get a -> Get a getLookAhead g = Get (F (\x y -> y (GetFLookAhead (GetLookAheadF g x))))@@ -291,34 +291,34 @@             ++ ")"         ) -getRemainingStaticArray :: (LiftedPrim a) => Proxy a -> Get (LiftedPrimArray a)-getRemainingStaticArray prox = do-  let ebc = staticByteSize prox-  bc <- getRemainingSize+getRemainingStaticArray :: forall a. (Prim a, PrimUnaligned a) => Proxy a -> Get (PrimArray a)+getRemainingStaticArray _ = do+  let ebc = sizeOfType @a+  bc <- fmap unByteCount getRemainingSize   let left = rem bc ebc   if left == 0-    then getStaticArray (coerce (div bc ebc))+    then getStaticArray (ElemCount (div bc ebc))     else       fail         ( "Leftover bytes for remaining static array (have "-            ++ show (unByteCount left)+            ++ show left             ++ ", need "-            ++ show (unByteCount ebc)+            ++ show ebc             ++ ")"         )  getRemainingByteArray :: Get ByteArray getRemainingByteArray = getRemainingSize >>= getByteArray -getRemainingLiftedPrimArray :: (LiftedPrim a) => Proxy a -> Get (LiftedPrimArray a)-getRemainingLiftedPrimArray prox = do+getRemainingPrimArray :: (StaticByteSized a) => Proxy a -> Get (PrimArray a)+getRemainingPrimArray prox = do   let ebc = staticByteSize prox   bc <- getRemainingSize   let left = rem bc ebc   if left == 0     then do       let ec = coerce (div bc ebc)-      getLiftedPrimArray prox ec+      getPrimArray prox ec     else       fail         ( "Leftover bytes for remaining lifted prim array (have "@@ -445,12 +445,12 @@ unsafePutStaticSeqN n mz p s = PutM (F (\x y -> y (PutFStaticSeq (PutStaticSeqF n mz p s (x ())))))  -- | Put Array of statically-sized elements-putStaticArray :: (LiftedPrim a) => LiftedPrimArray a -> Put+putStaticArray :: (Prim a, PrimUnaligned a) => PrimArray a -> Put putStaticArray a =-  let ec = lengthLiftedPrimArray a+  let ec = ElemCount (sizeofPrimArray a)   in  unsafePutStaticArrayN ec Nothing a -unsafePutStaticArrayN :: (LiftedPrim a) => ElemCount -> Maybe a -> LiftedPrimArray a -> Put+unsafePutStaticArrayN :: (Prim a, PrimUnaligned a) => ElemCount -> Maybe a -> PrimArray a -> Put unsafePutStaticArrayN n mz a = PutM (F (\x y -> y (PutFStaticArray (PutStaticArrayF n mz a (x ())))))  putByteArray :: ByteArray -> Put@@ -458,8 +458,8 @@   let bc = coerce (sizeofByteArray arr)   in  PutM (F (\x y -> y (PutFByteArray bc arr (x ())))) -putLiftedPrimArray :: LiftedPrimArray a -> Put-putLiftedPrimArray = putByteArray . unLiftedPrimArray+putPrimArray :: PrimArray a -> Put+putPrimArray = putByteArray . (\(PrimArray a) -> ByteArray a)  putStaticHint :: (StaticByteSized a) => (a -> Put) -> a -> Put putStaticHint p a =
− src/Dahdit/Internal.hs
@@ -1,144 +0,0 @@-module Dahdit.Internal where--import Data.Bits (Bits (..))-import Data.Int (Int16, Int32, Int64, Int8)-import Data.ShortWord (Int24, Word24)-import Data.Word (Word16, Word32, Word64, Word8)-import GHC.Float (castDoubleToWord64, castFloatToWord32, castWord32ToFloat, castWord64ToDouble)-import GHC.TypeLits (Nat)--newtype ViaFromIntegral (n :: Nat) x y = ViaFromIntegral {unViaFromIntegral :: y}-  deriving newtype (Num)---- Types that can swap endianness - swapEndian is its own inverse-class (Num w) => SwapEndian w where-  swapEndian :: w -> w--instance (SwapEndian x, Integral x, Integral y) => SwapEndian (ViaFromIntegral n x y) where-  swapEndian = ViaFromIntegral . fromIntegral @x @y . swapEndian . fromIntegral @y @x . unViaFromIntegral--instance SwapEndian Word8 where-  swapEndian = id--instance SwapEndian Int8 where-  swapEndian = id--instance SwapEndian Word16 where-  swapEndian w =-    let (!b0, !b1) = unMkWord16LE w-    in  mkWord16LE b1 b0--deriving via (ViaFromIntegral n Word16 Int16) instance SwapEndian Int16--instance SwapEndian Word24 where-  swapEndian w =-    let (!b0, !b1, !b2) = unMkWord24LE w-    in  mkWord24LE b2 b1 b0--deriving via (ViaFromIntegral n Word24 Int24) instance SwapEndian Int24--instance SwapEndian Word32 where-  swapEndian w =-    let (!b0, !b1, !b2, !b3) = unMkWord32LE w-    in  mkWord32LE b3 b2 b1 b0--deriving via (ViaFromIntegral n Word32 Int32) instance SwapEndian Int32--instance SwapEndian Word64 where-  swapEndian w =-    let (!b0, !b1, !b2, !b3, !b4, !b5, !b6, !b7) = unMkWord64LE w-    in  mkWord64LE b7 b6 b5 b4 b3 b2 b1 b0--deriving via (ViaFromIntegral n Word64 Int64) instance SwapEndian Int64--instance SwapEndian Float where-  swapEndian w =-    let (!b0, !b1, !b2, !b3) = unMkFloatLE w-    in  mkFloatLE b3 b2 b1 b0--instance SwapEndian Double where-  swapEndian w =-    let (!b0, !b1, !b2, !b3, !b4, !b5, !b6, !b7) = unMkDoubleLE w-    in  mkDoubleLE b7 b6 b5 b4 b3 b2 b1 b0--mkWord16LE :: Word8 -> Word8 -> Word16-mkWord16LE b0 b1 = (fromIntegral b1 `unsafeShiftL` 8) .|. fromIntegral b0--unMkWord16LE :: Word16 -> (Word8, Word8)-unMkWord16LE w =-  let b0 = fromIntegral w-      b1 = fromIntegral (w `shiftR` 8)-  in  (b0, b1)--mkWord24LE :: Word8 -> Word8 -> Word8 -> Word24-mkWord24LE b0 b1 b2 = fromIntegral (mkWord32LE b0 b1 b2 0)--unMkWord24LE :: Word24 -> (Word8, Word8, Word8)-unMkWord24LE w =-  let v = fromIntegral w-      (!b0, !b1, !b2, _) = unMkWord32LE v-  in  (b0, b1, b2)--mkWord32LE :: Word8 -> Word8 -> Word8 -> Word8 -> Word32-mkWord32LE b0 b1 b2 b3 =-  (fromIntegral b3 `unsafeShiftL` 24)-    .|. (fromIntegral b2 `unsafeShiftL` 16)-    .|. (fromIntegral b1 `unsafeShiftL` 8)-    .|. fromIntegral b0--unMkWord32LE :: Word32 -> (Word8, Word8, Word8, Word8)-unMkWord32LE w =-  let b0 = fromIntegral w-      b1 = fromIntegral (w `shiftR` 8)-      b2 = fromIntegral (w `shiftR` 16)-      b3 = fromIntegral (w `shiftR` 24)-  in  (b0, b1, b2, b3)--mkWord64LE :: Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word64-mkWord64LE b0 b1 b2 b3 b4 b5 b6 b7 =-  (fromIntegral b7 `unsafeShiftL` 56)-    .|. (fromIntegral b6 `unsafeShiftL` 48)-    .|. (fromIntegral b5 `unsafeShiftL` 40)-    .|. (fromIntegral b4 `unsafeShiftL` 32)-    .|. (fromIntegral b3 `unsafeShiftL` 24)-    .|. (fromIntegral b2 `unsafeShiftL` 16)-    .|. (fromIntegral b1 `unsafeShiftL` 8)-    .|. fromIntegral b0--unMkWord64LE :: Word64 -> (Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8)-unMkWord64LE w =-  let b0 = fromIntegral w-      b1 = fromIntegral (w `shiftR` 8)-      b2 = fromIntegral (w `shiftR` 16)-      b3 = fromIntegral (w `shiftR` 24)-      b4 = fromIntegral (w `shiftR` 32)-      b5 = fromIntegral (w `shiftR` 40)-      b6 = fromIntegral (w `shiftR` 48)-      b7 = fromIntegral (w `shiftR` 56)-  in  (b0, b1, b2, b3, b4, b5, b6, b7)--mkFloatLE :: Word8 -> Word8 -> Word8 -> Word8 -> Float-mkFloatLE b0 b1 b2 b3 = castWord32ToFloat (mkWord32LE b0 b1 b2 b3)--unMkFloatLE :: Float -> (Word8, Word8, Word8, Word8)-unMkFloatLE f = unMkWord32LE (castFloatToWord32 f)--mkDoubleLE :: Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Double-mkDoubleLE b0 b1 b2 b3 b4 b5 b6 b7 = castWord64ToDouble (mkWord64LE b0 b1 b2 b3 b4 b5 b6 b7)--unMkDoubleLE :: Double -> (Word8, Word8, Word8, Word8, Word8, Word8, Word8, Word8)-unMkDoubleLE f = unMkWord64LE (castDoubleToWord64 f)--class (Num le, Num be) => EndianPair (n :: Nat) le be | le -> n, be -> n, le -> be, be -> le where-  toLittleEndian :: be -> le-  toBigEndian :: le -> be--newtype ViaEndianPair (n :: Nat) le be = ViaEndianPair {unViaEndianPair :: be}--instance EndianPair 1 Word8 Word8 where-  toLittleEndian = id-  toBigEndian = id--instance EndianPair 1 Int8 Int8 where-  toLittleEndian = id-  toBigEndian = id
− src/Dahdit/LiftedPrim.hs
@@ -1,347 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}--module Dahdit.LiftedPrim-  ( LiftedPrim (..)-  , indexArrayLiftedInElems-  , writeArrayLiftedInElems-  , indexPtrLiftedInElems-  , writePtrLiftedInElems-  , setByteArrayLifted-  )-where--import Control.Monad.Primitive (PrimMonad (..))-import Dahdit.Internal-  ( EndianPair (..)-  , ViaEndianPair (..)-  , ViaFromIntegral (..)-  , mkDoubleLE-  , mkFloatLE-  , mkWord16LE-  , mkWord24LE-  , mkWord32LE-  , mkWord64LE-  , unMkDoubleLE-  , unMkFloatLE-  , unMkWord16LE-  , unMkWord24LE-  , unMkWord32LE-  , unMkWord64LE-  )-import Dahdit.Nums-  ( DoubleBE-  , DoubleLE (..)-  , FloatBE-  , FloatLE (..)-  , Int16BE-  , Int16LE (..)-  , Int24BE-  , Int24LE (..)-  , Int32BE-  , Int32LE (..)-  , Int64BE-  , Int64LE (..)-  , Word16BE-  , Word16LE (..)-  , Word24BE-  , Word24LE (..)-  , Word32BE-  , Word32LE (..)-  , Word64BE-  , Word64LE (..)-  )-import Dahdit.Proxy (proxyFor)-import Dahdit.Sizes (ByteCount (..), ElemCount (..), StaticByteSized (..))-import Data.Coerce (coerce)-import Data.Foldable (for_)-import Data.Int (Int8)-import Data.Primitive.ByteArray-  ( ByteArray-  , MutableByteArray-  , indexByteArray-  , writeByteArray-  )-import Data.Primitive.Ptr (indexOffPtr, writeOffPtr)-import Data.Proxy (Proxy (..))-import Data.Word (Word8)-import Foreign.Ptr (Ptr)---- | This is a stripped-down version of 'Prim' that is possible for a human to implement.--- It's all about reading and writing structures from lifted byte arrays and pointers.-class (StaticByteSized a) => LiftedPrim a where-  indexArrayLiftedInBytes :: ByteArray -> ByteCount -> a-  writeArrayLiftedInBytes :: (PrimMonad m) => MutableByteArray (PrimState m) -> ByteCount -> a -> m ()-  indexPtrLiftedInBytes :: Ptr Word8 -> ByteCount -> a-  writePtrLiftedInBytes :: (PrimMonad m) => Ptr Word8 -> ByteCount -> a -> m ()--indexArrayLiftedInElems :: (LiftedPrim a) => Proxy a -> ByteArray -> ElemCount -> a-indexArrayLiftedInElems prox arr pos =-  indexArrayLiftedInBytes arr (coerce pos * staticByteSize prox)--writeArrayLiftedInElems :: (PrimMonad m, LiftedPrim a) => MutableByteArray (PrimState m) -> ElemCount -> a -> m ()-writeArrayLiftedInElems arr pos val =-  writeArrayLiftedInBytes arr (coerce pos * staticByteSize (proxyFor val)) val--indexPtrLiftedInElems :: (LiftedPrim a) => Proxy a -> Ptr Word8 -> ElemCount -> a-indexPtrLiftedInElems prox ptr pos =-  indexPtrLiftedInBytes ptr (coerce pos * staticByteSize prox)--writePtrLiftedInElems :: (PrimMonad m, LiftedPrim a) => Ptr Word8 -> ElemCount -> a -> m ()-writePtrLiftedInElems ptr pos val =-  writePtrLiftedInBytes ptr (coerce pos * staticByteSize (proxyFor val)) val--instance LiftedPrim Word8 where-  indexArrayLiftedInBytes arr = indexByteArray arr . coerce-  writeArrayLiftedInBytes marr = writeByteArray marr . coerce-  indexPtrLiftedInBytes ptr = indexOffPtr ptr . coerce-  writePtrLiftedInBytes ptr = writeOffPtr ptr . coerce--instance LiftedPrim Int8 where-  indexArrayLiftedInBytes arr = indexByteArray arr . coerce-  writeArrayLiftedInBytes marr = writeByteArray marr . coerce-  indexPtrLiftedInBytes ptr = indexOffPtr (coerce ptr) . coerce-  writePtrLiftedInBytes ptr = writeOffPtr (coerce ptr) . coerce---- | NOTE: Relies on same byte width of both types!-instance (Integral x, LiftedPrim x, Integral y, n ~ StaticSize x) => LiftedPrim (ViaFromIntegral n x y) where-  indexArrayLiftedInBytes arr off = ViaFromIntegral (fromIntegral (indexArrayLiftedInBytes arr off :: x))-  writeArrayLiftedInBytes arr off val = let x = fromIntegral (unViaFromIntegral val) :: x in writeArrayLiftedInBytes arr off x-  indexPtrLiftedInBytes ptr = ViaFromIntegral . fromIntegral @x @y . indexPtrLiftedInBytes ptr-  writePtrLiftedInBytes ptr off (ViaFromIntegral y) = writePtrLiftedInBytes ptr off (fromIntegral y :: x)--instance LiftedPrim Word16LE where-  indexArrayLiftedInBytes arr off =-    let !b0 = indexByteArray arr (coerce off)-        !b1 = indexByteArray arr (coerce off + 1)-    in  Word16LE (mkWord16LE b0 b1)--  writeArrayLiftedInBytes arr off w =-    let (!b0, !b1) = unMkWord16LE (unWord16LE w)-    in  writeByteArray arr (coerce off) b0-          *> writeByteArray arr (coerce off + 1) b1--  indexPtrLiftedInBytes ptr off =-    let !b0 = indexOffPtr ptr (coerce off)-        !b1 = indexOffPtr ptr (coerce off + 1)-    in  Word16LE (mkWord16LE b0 b1)--  writePtrLiftedInBytes ptr off w =-    let (!b0, !b1) = unMkWord16LE (unWord16LE w)-    in  writeOffPtr ptr (coerce off) b0-          *> writeOffPtr ptr (coerce off + 1) b1--instance LiftedPrim Word24LE where-  indexArrayLiftedInBytes arr off =-    let !b0 = indexByteArray arr (coerce off)-        !b1 = indexByteArray arr (coerce off + 1)-        !b2 = indexByteArray arr (coerce off + 2)-    in  Word24LE (mkWord24LE b0 b1 b2)--  writeArrayLiftedInBytes arr off w = do-    let (!b0, !b1, !b2) = unMkWord24LE (unWord24LE w)-    writeByteArray arr (coerce off) b0-    writeByteArray arr (coerce off + 1) b1-    writeByteArray arr (coerce off + 2) b2--  indexPtrLiftedInBytes ptr off =-    let !b0 = indexOffPtr ptr (coerce off)-        !b1 = indexOffPtr ptr (coerce off + 1)-        !b2 = indexOffPtr ptr (coerce off + 2)-    in  Word24LE (mkWord24LE b0 b1 b2)--  writePtrLiftedInBytes ptr off w =-    let (!b0, !b1, !b2) = unMkWord24LE (unWord24LE w)-    in  writeOffPtr ptr (coerce off) b0-          *> writeOffPtr ptr (coerce off + 1) b1-          *> writeOffPtr ptr (coerce off + 2) b2--instance LiftedPrim Word32LE where-  indexArrayLiftedInBytes arr off =-    let !b0 = indexByteArray arr (coerce off)-        !b1 = indexByteArray arr (coerce off + 1)-        !b2 = indexByteArray arr (coerce off + 2)-        !b3 = indexByteArray arr (coerce off + 3)-    in  Word32LE (mkWord32LE b0 b1 b2 b3)--  writeArrayLiftedInBytes arr off w = do-    let (!b0, !b1, !b2, !b3) = unMkWord32LE (unWord32LE w)-    writeByteArray arr (coerce off) b0-    writeByteArray arr (coerce off + 1) b1-    writeByteArray arr (coerce off + 2) b2-    writeByteArray arr (coerce off + 3) b3--  indexPtrLiftedInBytes ptr off =-    let !b0 = indexOffPtr ptr (coerce off)-        !b1 = indexOffPtr ptr (coerce off + 1)-        !b2 = indexOffPtr ptr (coerce off + 2)-        !b3 = indexOffPtr ptr (coerce off + 3)-    in  Word32LE (mkWord32LE b0 b1 b2 b3)--  writePtrLiftedInBytes ptr off w =-    let (!b0, !b1, !b2, !b3) = unMkWord32LE (unWord32LE w)-    in  writeOffPtr ptr (coerce off) b0-          *> writeOffPtr ptr (coerce off + 1) b1-          *> writeOffPtr ptr (coerce off + 2) b2-          *> writeOffPtr ptr (coerce off + 3) b3--instance LiftedPrim Word64LE where-  indexArrayLiftedInBytes arr off =-    let !b0 = indexArrayLiftedInBytes arr (coerce off)-        !b1 = indexArrayLiftedInBytes arr (coerce off + 1)-        !b2 = indexArrayLiftedInBytes arr (coerce off + 2)-        !b3 = indexArrayLiftedInBytes arr (coerce off + 3)-        !b4 = indexArrayLiftedInBytes arr (coerce off + 4)-        !b5 = indexArrayLiftedInBytes arr (coerce off + 5)-        !b6 = indexArrayLiftedInBytes arr (coerce off + 6)-        !b7 = indexArrayLiftedInBytes arr (coerce off + 7)-    in  Word64LE (mkWord64LE b0 b1 b2 b3 b4 b5 b6 b7)--  writeArrayLiftedInBytes arr off w = do-    let (!b0, !b1, !b2, !b3, !b4, !b5, !b6, !b7) = unMkWord64LE (unWord64LE w)-    writeByteArray arr (coerce off) b0-    writeByteArray arr (coerce off + 1) b1-    writeByteArray arr (coerce off + 2) b2-    writeByteArray arr (coerce off + 3) b3-    writeByteArray arr (coerce off + 4) b4-    writeByteArray arr (coerce off + 5) b5-    writeByteArray arr (coerce off + 6) b6-    writeByteArray arr (coerce off + 7) b7--  indexPtrLiftedInBytes ptr off =-    let !b0 = indexOffPtr ptr (coerce off)-        !b1 = indexOffPtr ptr (coerce off + 1)-        !b2 = indexOffPtr ptr (coerce off + 2)-        !b3 = indexOffPtr ptr (coerce off + 3)-        !b4 = indexOffPtr ptr (coerce off + 4)-        !b5 = indexOffPtr ptr (coerce off + 5)-        !b6 = indexOffPtr ptr (coerce off + 6)-        !b7 = indexOffPtr ptr (coerce off + 7)-    in  Word64LE (mkWord64LE b0 b1 b2 b3 b4 b5 b6 b7)--  writePtrLiftedInBytes ptr off w =-    let (!b0, !b1, !b2, !b3, !b4, !b5, !b6, !b7) = unMkWord64LE (unWord64LE w)-    in  writeOffPtr ptr (coerce off) b0-          *> writeOffPtr ptr (coerce off + 1) b1-          *> writeOffPtr ptr (coerce off + 2) b2-          *> writeOffPtr ptr (coerce off + 3) b3-          *> writeOffPtr ptr (coerce off + 4) b4-          *> writeOffPtr ptr (coerce off + 5) b5-          *> writeOffPtr ptr (coerce off + 6) b6-          *> writeOffPtr ptr (coerce off + 7) b7--instance LiftedPrim FloatLE where-  indexArrayLiftedInBytes arr off =-    let !b0 = indexByteArray arr (coerce off)-        !b1 = indexByteArray arr (coerce off + 1)-        !b2 = indexByteArray arr (coerce off + 2)-        !b3 = indexByteArray arr (coerce off + 3)-    in  FloatLE (mkFloatLE b0 b1 b2 b3)--  writeArrayLiftedInBytes arr off f = do-    let (!b0, !b1, !b2, !b3) = unMkFloatLE (unFloatLE f)-    writeByteArray arr (coerce off) b0-    writeByteArray arr (coerce off + 1) b1-    writeByteArray arr (coerce off + 2) b2-    writeByteArray arr (coerce off + 3) b3--  indexPtrLiftedInBytes ptr off =-    let !b0 = indexOffPtr ptr (coerce off)-        !b1 = indexOffPtr ptr (coerce off + 1)-        !b2 = indexOffPtr ptr (coerce off + 2)-        !b3 = indexOffPtr ptr (coerce off + 3)-    in  FloatLE (mkFloatLE b0 b1 b2 b3)--  writePtrLiftedInBytes ptr off f =-    let (!b0, !b1, !b2, !b3) = unMkFloatLE (unFloatLE f)-    in  writeOffPtr ptr (coerce off) b0-          *> writeOffPtr ptr (coerce off + 1) b1-          *> writeOffPtr ptr (coerce off + 2) b2-          *> writeOffPtr ptr (coerce off + 3) b3--instance LiftedPrim DoubleLE where-  indexArrayLiftedInBytes arr off =-    let !b0 = indexArrayLiftedInBytes arr (coerce off)-        !b1 = indexArrayLiftedInBytes arr (coerce off + 1)-        !b2 = indexArrayLiftedInBytes arr (coerce off + 2)-        !b3 = indexArrayLiftedInBytes arr (coerce off + 3)-        !b4 = indexArrayLiftedInBytes arr (coerce off + 4)-        !b5 = indexArrayLiftedInBytes arr (coerce off + 5)-        !b6 = indexArrayLiftedInBytes arr (coerce off + 6)-        !b7 = indexArrayLiftedInBytes arr (coerce off + 7)-    in  DoubleLE (mkDoubleLE b0 b1 b2 b3 b4 b5 b6 b7)--  writeArrayLiftedInBytes arr off f = do-    let (!b0, !b1, !b2, !b3, !b4, !b5, !b6, !b7) = unMkDoubleLE (unDoubleLE f)-    writeByteArray arr (coerce off) b0-    writeByteArray arr (coerce off + 1) b1-    writeByteArray arr (coerce off + 2) b2-    writeByteArray arr (coerce off + 3) b3-    writeByteArray arr (coerce off + 4) b4-    writeByteArray arr (coerce off + 5) b5-    writeByteArray arr (coerce off + 6) b6-    writeByteArray arr (coerce off + 7) b7--  indexPtrLiftedInBytes ptr off =-    let !b0 = indexOffPtr ptr (coerce off)-        !b1 = indexOffPtr ptr (coerce off + 1)-        !b2 = indexOffPtr ptr (coerce off + 2)-        !b3 = indexOffPtr ptr (coerce off + 3)-        !b4 = indexOffPtr ptr (coerce off + 4)-        !b5 = indexOffPtr ptr (coerce off + 5)-        !b6 = indexOffPtr ptr (coerce off + 6)-        !b7 = indexOffPtr ptr (coerce off + 7)-    in  DoubleLE (mkDoubleLE b0 b1 b2 b3 b4 b5 b6 b7)--  writePtrLiftedInBytes ptr off f =-    let (!b0, !b1, !b2, !b3, !b4, !b5, !b6, !b7) = unMkDoubleLE (unDoubleLE f)-    in  writeOffPtr ptr (coerce off) b0-          *> writeOffPtr ptr (coerce off + 1) b1-          *> writeOffPtr ptr (coerce off + 2) b2-          *> writeOffPtr ptr (coerce off + 3) b3-          *> writeOffPtr ptr (coerce off + 4) b4-          *> writeOffPtr ptr (coerce off + 5) b5-          *> writeOffPtr ptr (coerce off + 6) b6-          *> writeOffPtr ptr (coerce off + 7) b7--instance (LiftedPrim le, EndianPair n le be, n ~ StaticSize le) => LiftedPrim (ViaEndianPair n le be) where-  indexArrayLiftedInBytes arr off = ViaEndianPair (toBigEndian (indexArrayLiftedInBytes arr off))-  writeArrayLiftedInBytes arr off = writeArrayLiftedInBytes arr off . toLittleEndian . unViaEndianPair-  indexPtrLiftedInBytes ptr off = ViaEndianPair (toBigEndian (indexPtrLiftedInBytes ptr off))-  writePtrLiftedInBytes ptr off = writePtrLiftedInBytes ptr off . toLittleEndian . unViaEndianPair--deriving via (ViaFromIntegral 2 Word16LE Int16LE) instance LiftedPrim Int16LE--deriving via (ViaFromIntegral 3 Word24LE Int24LE) instance LiftedPrim Int24LE--deriving via (ViaFromIntegral 4 Word32LE Int32LE) instance LiftedPrim Int32LE--deriving via (ViaFromIntegral 8 Word64LE Int64LE) instance LiftedPrim Int64LE--deriving via (ViaEndianPair 2 Word16LE Word16BE) instance LiftedPrim Word16BE--deriving via (ViaEndianPair 2 Int16LE Int16BE) instance LiftedPrim Int16BE--deriving via (ViaEndianPair 3 Word24LE Word24BE) instance LiftedPrim Word24BE--deriving via (ViaEndianPair 3 Int24LE Int24BE) instance LiftedPrim Int24BE--deriving via (ViaEndianPair 4 Word32LE Word32BE) instance LiftedPrim Word32BE--deriving via (ViaEndianPair 4 Int32LE Int32BE) instance LiftedPrim Int32BE--deriving via (ViaEndianPair 8 Word64LE Word64BE) instance LiftedPrim Word64BE--deriving via (ViaEndianPair 8 Int64LE Int64BE) instance LiftedPrim Int64BE--deriving via (ViaEndianPair 4 FloatLE FloatBE) instance LiftedPrim FloatBE--deriving via (ViaEndianPair 8 DoubleLE DoubleBE) instance LiftedPrim DoubleBE---- | Fill a byte array with the given value-setByteArrayLifted-  :: (PrimMonad m, LiftedPrim a) => MutableByteArray (PrimState m) -> ByteCount -> ByteCount -> a -> m ()-setByteArrayLifted arr off len val = do-  let elemSize = staticByteSize (proxyFor val)-      elemLen = div (coerce len) elemSize-  for_ [0 .. elemLen - 1] $ \pos ->-    writeArrayLiftedInBytes arr (off + pos * elemSize) val
− src/Dahdit/LiftedPrimArray.hs
@@ -1,123 +0,0 @@-module Dahdit.LiftedPrimArray-  ( LiftedPrimArray (..)-  , MutableLiftedPrimArray (..)-  , emptyLiftedPrimArray-  , indexLiftedPrimArray-  , writeLiftedPrimArray-  , freezeLiftedPrimArray-  , thawLiftedPrimArray-  , unsafeFreezeLiftedPrimArray-  , unsafeThawLiftedPrimArray-  , liftedPrimArrayFromListN-  , liftedPrimArrayFromList-  , generateLiftedPrimArray-  , sizeofLiftedPrimArray-  , lengthLiftedPrimArray-  , cloneLiftedPrimArray-  , replicateLiftedPrimArray-  )-where--import Control.Monad.Primitive (PrimMonad (..))-import Dahdit.LiftedPrim-  ( LiftedPrim (..)-  , indexArrayLiftedInElems-  , writeArrayLiftedInElems-  )-import Dahdit.Proxy (proxyFor, proxyForF)-import Dahdit.Sizes (ByteCount (..), ElemCount (..), StaticByteSized (..))-import Data.Coerce (coerce)-import Data.Default (Default (..))-import Data.Foldable (for_)-import Data.Primitive.ByteArray-  ( ByteArray-  , MutableByteArray-  , cloneByteArray-  , emptyByteArray-  , freezeByteArray-  , newByteArray-  , runByteArray-  , sizeofByteArray-  , thawByteArray-  , unsafeFreezeByteArray-  , unsafeThawByteArray-  )-import Data.Proxy (Proxy (..))-import Data.STRef (modifySTRef', newSTRef, readSTRef)--newtype LiftedPrimArray a = LiftedPrimArray {unLiftedPrimArray :: ByteArray}-  deriving stock (Show)-  deriving newtype (Eq, Ord, Semigroup, Monoid)--instance Default (LiftedPrimArray a) where-  def = emptyLiftedPrimArray--newtype MutableLiftedPrimArray m a = MutableLiftedPrimArray {unMutableLiftedPrimArray :: MutableByteArray m}-  deriving newtype (Eq)--emptyLiftedPrimArray :: LiftedPrimArray a-emptyLiftedPrimArray = LiftedPrimArray emptyByteArray--indexLiftedPrimArray :: (LiftedPrim a) => LiftedPrimArray a -> ElemCount -> a-indexLiftedPrimArray (LiftedPrimArray arr) = indexArrayLiftedInElems Proxy arr--writeLiftedPrimArray :: (LiftedPrim a, PrimMonad m) => MutableLiftedPrimArray (PrimState m) a -> ElemCount -> a -> m ()-writeLiftedPrimArray (MutableLiftedPrimArray arr) = writeArrayLiftedInElems arr--freezeLiftedPrimArray-  :: (PrimMonad m) => MutableLiftedPrimArray (PrimState m) a -> ElemCount -> ElemCount -> m (LiftedPrimArray a)-freezeLiftedPrimArray (MutableLiftedPrimArray arr) off len = fmap LiftedPrimArray (freezeByteArray arr (coerce off) (coerce len))--unsafeFreezeLiftedPrimArray :: (PrimMonad m) => MutableLiftedPrimArray (PrimState m) a -> m (LiftedPrimArray a)-unsafeFreezeLiftedPrimArray (MutableLiftedPrimArray arr) = fmap LiftedPrimArray (unsafeFreezeByteArray arr)--thawLiftedPrimArray-  :: (PrimMonad m) => LiftedPrimArray a -> ElemCount -> ElemCount -> m (MutableLiftedPrimArray (PrimState m) a)-thawLiftedPrimArray (LiftedPrimArray arr) off len = fmap MutableLiftedPrimArray (thawByteArray arr (coerce off) (coerce len))--unsafeThawLiftedPrimArray :: (PrimMonad m) => LiftedPrimArray a -> m (MutableLiftedPrimArray (PrimState m) a)-unsafeThawLiftedPrimArray (LiftedPrimArray arr) = fmap MutableLiftedPrimArray (unsafeThawByteArray arr)--liftedPrimArrayFromListN :: (LiftedPrim a) => ElemCount -> [a] -> LiftedPrimArray a-liftedPrimArrayFromListN n xs = LiftedPrimArray $ runByteArray $ do-  let elemSize = staticByteSize (proxyForF xs)-      len = coerce n * coerce elemSize-  arr <- newByteArray len-  offRef <- newSTRef 0-  for_ xs $ \x -> do-    off <- readSTRef offRef-    writeArrayLiftedInBytes arr off x-    modifySTRef' offRef (elemSize +)-  pure arr--liftedPrimArrayFromList :: (LiftedPrim a) => [a] -> LiftedPrimArray a-liftedPrimArrayFromList xs = liftedPrimArrayFromListN (coerce (length xs)) xs--generateLiftedPrimArray :: (LiftedPrim a) => ElemCount -> (ElemCount -> a) -> LiftedPrimArray a-generateLiftedPrimArray n f = liftedPrimArrayFromListN n (fmap f [0 .. n - 1])--sizeofLiftedPrimArray :: LiftedPrimArray a -> ByteCount-sizeofLiftedPrimArray (LiftedPrimArray arr) = coerce (sizeofByteArray arr)--lengthLiftedPrimArray :: (LiftedPrim a) => LiftedPrimArray a -> ElemCount-lengthLiftedPrimArray pa@(LiftedPrimArray arr) =-  let elemSize = coerce (staticByteSize (proxyForF pa))-      arrSize = sizeofByteArray arr-  in  coerce (div arrSize elemSize)--cloneLiftedPrimArray :: (LiftedPrim a) => LiftedPrimArray a -> ElemCount -> ElemCount -> LiftedPrimArray a-cloneLiftedPrimArray pa@(LiftedPrimArray arr) off len =-  let elemSize = staticByteSize (proxyForF pa)-      byteOff = coerce off * elemSize-      byteLen = coerce len * elemSize-      arr' = cloneByteArray arr (coerce byteOff) (coerce byteLen)-  in  LiftedPrimArray arr'--replicateLiftedPrimArray :: (LiftedPrim a) => ElemCount -> a -> LiftedPrimArray a-replicateLiftedPrimArray len val = LiftedPrimArray $ runByteArray $ do-  let elemSize = staticByteSize (proxyFor val)-      byteLen = coerce len * elemSize-  arr <- newByteArray (coerce byteLen)-  for_ [0 .. len - 1] $ \pos ->-    writeArrayLiftedInBytes arr (coerce pos * elemSize) val-  pure arr
src/Dahdit/Mem.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE InstanceSigs #-}+ module Dahdit.Mem   ( MemPtr (..)   , emptyMemPtr@@ -18,14 +20,12 @@ where  import Control.Monad.Primitive (MonadPrim, PrimMonad (..), RealWorld)-import Dahdit.LiftedPrim (LiftedPrim (..), setByteArrayLifted)-import Dahdit.Proxy (proxyFor)-import Dahdit.Sizes (ByteCount (..), staticByteSize)+import Dahdit.Sizes (ByteCount (..)) import Data.ByteString (ByteString) import qualified Data.ByteString.Internal as BSI import Data.ByteString.Short.Internal (ShortByteString (..))-import Data.Coerce (coerce) import Data.Foldable (for_)+import Data.Primitive (Prim (..), sizeOfType) import Data.Primitive.ByteArray   ( ByteArray (..)   , MutableByteArray@@ -34,17 +34,19 @@   , copyByteArrayToPtr   , freezeByteArray   , newByteArray+  , setByteArray   , unsafeFreezeByteArray   , unsafeThawByteArray   )-import Data.Primitive.Ptr (copyPtrToMutableByteArray)+import Data.Primitive.ByteArray.Unaligned (PrimUnaligned, indexUnalignedByteArray, writeUnalignedByteArray)+import Data.Primitive.Ptr (copyPtrToMutableByteArray, indexOffPtr, writeOffPtr) import Data.Vector.Storable (Vector) import qualified Data.Vector.Storable as VS import Data.Vector.Storable.Mutable (IOVector) import qualified Data.Vector.Storable.Mutable as VSM import Data.Word (Word8) import Foreign.ForeignPtr (ForeignPtr, mallocForeignPtrBytes, withForeignPtr)-import Foreign.Ptr (Ptr, plusPtr)+import Foreign.Ptr (Ptr, castPtr, plusPtr)  data MemPtr s = MemPtr   { mpForeign :: !(ForeignPtr Word8)@@ -57,7 +59,7 @@ emptyMemPtr = allocPtrMem 0  withMemPtr :: MemPtr RealWorld -> (Ptr Word8 -> IO a) -> IO a-withMemPtr (MemPtr fp off _) f = withForeignPtr fp (\ptr -> f (plusPtr ptr (coerce off)))+withMemPtr (MemPtr fp off _) f = withForeignPtr fp (\ptr -> f (plusPtr ptr (unByteCount off)))  class (PrimMonad m) => MutableMem r w m | w m -> r where   unsafeThawMem :: r -> m w@@ -76,23 +78,26 @@   unsafeFreezeMem = VS.unsafeFreeze  class (PrimMonad m) => ReadMem r m where-  indexMemInBytes :: (LiftedPrim a) => r -> ByteCount -> m a+  indexMemInBytes :: (Prim a, PrimUnaligned a) => r -> ByteCount -> m a   cloneArrayMemInBytes :: r -> ByteCount -> ByteCount -> m ByteArray  instance (PrimMonad m) => ReadMem ByteArray m where-  indexMemInBytes arr off = pure (indexArrayLiftedInBytes arr off)-  cloneArrayMemInBytes arr off len = pure (cloneByteArray arr (coerce off) (coerce len))+  indexMemInBytes arr off = pure (indexUnalignedByteArray arr (unByteCount off))+  cloneArrayMemInBytes arr off len = pure (cloneByteArray arr (unByteCount off) (unByteCount len))  cloneMemPtr :: MemPtr RealWorld -> ByteCount -> ByteCount -> IO ByteArray cloneMemPtr mem off len = do-  marr <- newByteArray (coerce len)+  marr <- newByteArray (unByteCount len)   withMemPtr mem $ \ptr -> do-    let wptr = plusPtr ptr (coerce off) :: Ptr Word8-    copyPtrToMutableByteArray marr 0 wptr (coerce len)+    let wptr = plusPtr ptr (unByteCount off) :: Ptr Word8+    copyPtrToMutableByteArray marr 0 wptr (unByteCount len)   unsafeFreezeByteArray marr  instance ReadMem (MemPtr RealWorld) IO where-  indexMemInBytes mem off = withMemPtr mem (\ptr -> pure (indexPtrLiftedInBytes ptr off))+  indexMemInBytes :: forall a. (Prim a) => MemPtr RealWorld -> ByteCount -> IO a+  indexMemInBytes mem off = withMemPtr mem $ \ptr ->+    let wptr = plusPtr ptr (unByteCount off)+    in  pure (indexOffPtr wptr 0)   cloneArrayMemInBytes = cloneMemPtr  readSBSMem :: (ReadMem r m) => r -> ByteCount -> ByteCount -> m ShortByteString@@ -104,38 +109,41 @@ viewSBSMem (SBS harr) = ByteArray harr  viewBSMem :: ByteString -> MemPtr RealWorld-viewBSMem bs = let (fp, off, len) = BSI.toForeignPtr bs in MemPtr fp (coerce off) (coerce len)+viewBSMem bs = let (fp, off, len) = BSI.toForeignPtr bs in MemPtr fp (ByteCount off) (ByteCount len)  viewVecMem :: Vector Word8 -> MemPtr RealWorld-viewVecMem vec = let (fp, off, len) = VS.unsafeToForeignPtr vec in MemPtr fp (coerce off) (coerce len)+viewVecMem vec = let (fp, off, len) = VS.unsafeToForeignPtr vec in MemPtr fp (ByteCount off) (ByteCount len)  mutViewVecMem :: IOVector Word8 -> MemPtr RealWorld-mutViewVecMem mvec = let (fp, off, len) = VSM.unsafeToForeignPtr mvec in MemPtr fp (coerce off) (coerce len)+mutViewVecMem mvec = let (fp, off, len) = VSM.unsafeToForeignPtr mvec in MemPtr fp (ByteCount off) (ByteCount len)  class (PrimMonad m) => WriteMem q m where-  writeMemInBytes :: (LiftedPrim a) => a -> q (PrimState m) -> ByteCount -> m ()+  writeMemInBytes :: (Prim a, PrimUnaligned a) => a -> q (PrimState m) -> ByteCount -> m ()   copyArrayMemInBytes :: ByteArray -> ByteCount -> ByteCount -> q (PrimState m) -> ByteCount -> m ()-  setMemInBytes :: (LiftedPrim a) => ByteCount -> a -> q (PrimState m) -> ByteCount -> m ()+  setMemInBytes :: (Prim a, PrimUnaligned a) => ByteCount -> a -> q (PrimState m) -> ByteCount -> m ()  instance (PrimMonad m) => WriteMem MutableByteArray m where-  writeMemInBytes val mem off = writeArrayLiftedInBytes mem off val-  copyArrayMemInBytes arr arrOff arrLen mem off = copyByteArray mem (coerce off) arr (coerce arrOff) (coerce arrLen)-  setMemInBytes len val mem off = setByteArrayLifted mem off len val+  writeMemInBytes val mem off = writeUnalignedByteArray mem (unByteCount off) val+  copyArrayMemInBytes arr arrOff arrLen mem off = copyByteArray mem (unByteCount off) arr (unByteCount arrOff) (unByteCount arrLen)+  setMemInBytes len val mem off = setByteArray mem (unByteCount off) (unByteCount len) val  copyPtr :: (PrimMonad m) => ByteArray -> ByteCount -> ByteCount -> Ptr Word8 -> ByteCount -> m () copyPtr arr arrOff arrLen ptr off =-  let wptr = coerce (plusPtr ptr (coerce off)) :: Ptr Word8-  in  copyByteArrayToPtr wptr arr (coerce arrOff) (coerce arrLen)+  let wptr = castPtr (plusPtr ptr (unByteCount off)) :: Ptr Word8+  in  copyByteArrayToPtr wptr arr (unByteCount arrOff) (unByteCount arrLen) -setPtr :: (PrimMonad m, LiftedPrim a) => ByteCount -> a -> Ptr Word8 -> ByteCount -> m ()-setPtr len val ptr off = do-  let elemSize = staticByteSize (proxyFor val)-      elemLen = div (coerce len) elemSize+setPtr :: forall m a. (PrimMonad m, Prim a) => ByteCount -> a -> Ptr Word8 -> ByteCount -> m ()+setPtr (ByteCount len) val ptr (ByteCount off) = do+  let elemSize = sizeOfType @a+      elemLen = div len elemSize   for_ [0 .. elemLen - 1] $ \pos ->-    writePtrLiftedInBytes ptr (off + pos * elemSize) val+    let wptr = plusPtr ptr (off + pos * elemSize)+    in  writeOffPtr wptr 0 val  instance WriteMem MemPtr IO where-  writeMemInBytes val mem off = withMemPtr mem (\ptr -> writePtrLiftedInBytes ptr off val)+  writeMemInBytes val mem off = withMemPtr mem $ \ptr ->+    let wptr = plusPtr ptr (unByteCount off)+    in  writeOffPtr wptr 0 val   copyArrayMemInBytes arr arrOff arrLen mem off = withMemPtr mem (\ptr -> copyPtr arr arrOff arrLen ptr off)   setMemInBytes len val mem off = withMemPtr mem (\ptr -> setPtr len val ptr off) @@ -144,27 +152,27 @@  withBAMem :: (MonadPrim s m) => ByteCount -> (MutableByteArray s -> m ByteCount) -> m ByteArray withBAMem len use = do-  marr <- newByteArray (coerce len)+  marr <- newByteArray (unByteCount len)   len' <- use marr   if len' == len     then unsafeFreezeByteArray marr-    else freezeByteArray marr 0 (coerce len')+    else freezeByteArray marr 0 (unByteCount len')  withSBSMem :: (MonadPrim s m) => ByteCount -> (MutableByteArray s -> m ByteCount) -> m ShortByteString withSBSMem len use = fmap (\(ByteArray arr) -> SBS arr) (withBAMem len use)  allocPtrMem :: ByteCount -> IO (MemPtr RealWorld) allocPtrMem len = do-  fp <- mallocForeignPtrBytes (coerce len)+  fp <- mallocForeignPtrBytes (unByteCount len)   pure (MemPtr fp 0 len)  freezeVecMem :: MemPtr RealWorld -> ByteCount -> Vector Word8 freezeVecMem (MemPtr fp off _) len =-  VS.unsafeFromForeignPtr fp (coerce off) (coerce (off + len))+  VS.unsafeFromForeignPtr fp (unByteCount off) (unByteCount (off + len))  freezeBSMem :: MemPtr RealWorld -> ByteCount -> ByteString freezeBSMem (MemPtr fp off _) len =-  BSI.fromForeignPtr fp (coerce off) (coerce (off + len))+  BSI.fromForeignPtr fp (unByteCount off) (unByteCount (off + len))  withVecMem :: ByteCount -> (MemPtr RealWorld -> IO ByteCount) -> IO (Vector Word8) withVecMem len use = do
src/Dahdit/Nums.hs view
@@ -1,8 +1,11 @@+{-# LANGUAGE MagicHash #-} {-# LANGUAGE UnboxedTuples #-} {-# LANGUAGE UndecidableInstances #-} --- | Derived instances rely on the host system being little-endian.--- If it's not, well... some CPP is in order.+-- | Internally, all numbers are represented in little-endian format+-- (since that is what the host endianness is on any arch we'd be using).+-- 'Prim' instances for big endian variants actually do the conversion+-- at read/write time. module Dahdit.Nums   ( Word16LE (..)   , Int16LE (..)@@ -27,141 +30,173 @@   ) where -import Dahdit.Internal (EndianPair (..), swapEndian)-import Data.Bits (Bits)+import Dahdit.ShortWord ()+import Data.Bits (Bits (..), FiniteBits (..))+import Data.Coerce (Coercible, coerce) import Data.Default (Default (..))-import Data.Int (Int16, Int32, Int64)+import Data.Int (Int16, Int32, Int64, Int8)+import Data.Primitive (Prim (..))+import Data.Primitive.ByteArray.Unaligned (PrimUnaligned (..))+import Data.Proxy (Proxy (..)) import Data.ShortWord (Int24, Word24)-import Data.Word (Word16, Word32, Word64)+import Data.Word (Word16, Word32, Word64, Word8, byteSwap16, byteSwap32, byteSwap64)+import GHC.Float (castDoubleToWord64, castFloatToWord32, castWord32ToFloat, castWord64ToDouble)  newtype Word16LE = Word16LE {unWord16LE :: Word16}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)--newtype Int16LE = Int16LE {unInt16LE :: Int16}-  deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Prim, PrimUnaligned, Default, Bits, FiniteBits, Bounded)  newtype Word24LE = Word24LE {unWord24LE :: Word24}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits)--instance Default Word24LE where-  def = 0+  deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Prim, PrimUnaligned, Default, Bits, FiniteBits, Bounded) -newtype Int24LE = Int24LE {unInt24LE :: Int24}+newtype Word32LE = Word32LE {unWord32LE :: Word32}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits)+  deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Prim, PrimUnaligned, Default, Bits, FiniteBits, Bounded) -instance Default Int24LE where-  def = 0+newtype Word64LE = Word64LE {unWord64LE :: Word64}+  deriving stock (Show)+  deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Prim, PrimUnaligned, Default, Bits, FiniteBits, Bounded) -newtype Word32LE = Word32LE {unWord32LE :: Word32}+newtype Int16LE = Int16LE {unInt16LE :: Int16}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Prim, PrimUnaligned, Default, Bits, FiniteBits, Bounded) -newtype Word64LE = Word64LE {unWord64LE :: Word64}+newtype Int24LE = Int24LE {unInt24LE :: Int24}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Prim, PrimUnaligned, Default, Bits, FiniteBits, Bounded)  newtype Int32LE = Int32LE {unInt32LE :: Int32}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Prim, PrimUnaligned, Default, Bits, FiniteBits, Bounded)  newtype Int64LE = Int64LE {unInt64LE :: Int64}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Prim, PrimUnaligned, Default, Bits, FiniteBits, Bounded)  newtype FloatLE = FloatLE {unFloatLE :: Float}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Real, Fractional, Floating, RealFrac, Default)+  deriving newtype (Eq, Ord, Num, Real, Fractional, Floating, PrimUnaligned, RealFrac, Default, Prim)  newtype DoubleLE = DoubleLE {unDoubleLE :: Double}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Real, Fractional, Floating, RealFrac, Default)+  deriving newtype (Eq, Ord, Num, Real, Fractional, Floating, PrimUnaligned, RealFrac, Default, Prim)  newtype Word16BE = Word16BE {unWord16BE :: Word16}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)--newtype Int16BE = Int16BE {unInt16BE :: Int16}-  deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Enum, Num, Real, Integral, Default, Bits, FiniteBits, Bounded)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Word16 Word16BE)  newtype Word24BE = Word24BE {unWord24BE :: Word24}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits)--instance Default Word24BE where-  def = 0+  deriving newtype (Eq, Ord, Enum, Num, Real, Integral, Default, Bits, FiniteBits, Bounded)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Word24 Word24BE) -newtype Int24BE = Int24BE {unInt24BE :: Int24}+newtype Word32BE = Word32BE {unWord32BE :: Word32}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits)+  deriving newtype (Eq, Ord, Enum, Num, Real, Integral, Default, Bits, FiniteBits, Bounded)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Word32 Word32BE) -instance Default Int24BE where-  def = 0+newtype Word64BE = Word64BE {unWord64BE :: Word64}+  deriving stock (Show)+  deriving newtype (Eq, Ord, Enum, Num, Real, Integral, Default, Bits, FiniteBits, Bounded)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Word64 Word64BE) -newtype Word32BE = Word32BE {unWord32BE :: Word32}+newtype Int16BE = Int16BE {unInt16BE :: Int16}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Enum, Num, Real, Integral, Default, Bits, FiniteBits, Bounded)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Int16 Int16BE) -newtype Int32BE = Int32BE {unInt32BE :: Int32}+newtype Int24BE = Int24BE {unInt24BE :: Int24}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Enum, Num, Real, Integral, Default, Bits, FiniteBits, Bounded)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Int24 Int24BE) -newtype Word64BE = Word64BE {unWord64BE :: Word64}+newtype Int32BE = Int32BE {unInt32BE :: Int32}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Enum, Num, Real, Integral, Default, Bits, FiniteBits, Bounded)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Int32 Int32BE)  newtype Int64BE = Int64BE {unInt64BE :: Int64}   deriving stock (Show)-  deriving newtype (Eq, Ord, Num, Enum, Bounded, Real, Integral, Bits, Default)+  deriving newtype (Eq, Ord, Enum, Num, Real, Integral, Default, Bits, FiniteBits, Bounded)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Int64 Int64BE)  newtype FloatBE = FloatBE {unFloatBE :: Float}   deriving stock (Show)   deriving newtype (Eq, Ord, Num, Real, Fractional, Floating, RealFrac, Default)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Float FloatBE)  newtype DoubleBE = DoubleBE {unDoubleBE :: Double}   deriving stock (Show)   deriving newtype (Eq, Ord, Num, Real, Fractional, Floating, RealFrac, Default)+  deriving (Prim, PrimUnaligned) via (ViaSwapEndian Double DoubleBE) -instance EndianPair 2 Word16LE Word16BE where-  toLittleEndian = Word16LE . swapEndian . unWord16BE-  toBigEndian = Word16BE . swapEndian . unWord16LE+byteSwap24 :: Word24 -> Word24+byteSwap24 = fromIntegral . flip shiftR 8 . byteSwap32 . fromIntegral+{-# INLINE byteSwap24 #-} -instance EndianPair 2 Int16LE Int16BE where-  toLittleEndian = Int16LE . swapEndian . unInt16BE-  toBigEndian = Int16BE . swapEndian . unInt16LE+class (Coercible le x, Coercible be x) => SwapEndian x le be | x -> le be, le -> x be, be -> x le where+  swapEndian :: x -> x -instance EndianPair 3 Word24LE Word24BE where-  toLittleEndian = Word24LE . swapEndian . unWord24BE-  toBigEndian = Word24BE . swapEndian . unWord24LE+instance SwapEndian Word8 Word8 Word8 where+  swapEndian = id -instance EndianPair 3 Int24LE Int24BE where-  toLittleEndian = Int24LE . swapEndian . unInt24BE-  toBigEndian = Int24BE . swapEndian . unInt24LE+instance SwapEndian Int8 Int8 Int8 where+  swapEndian = id -instance EndianPair 4 Word32LE Word32BE where-  toLittleEndian = Word32LE . swapEndian . unWord32BE-  toBigEndian = Word32BE . swapEndian . unWord32LE+instance SwapEndian Word16 Word16LE Word16BE where+  swapEndian = byteSwap16 -instance EndianPair 4 Int32LE Int32BE where-  toLittleEndian = Int32LE . swapEndian . unInt32BE-  toBigEndian = Int32BE . swapEndian . unInt32LE+instance SwapEndian Int16 Int16LE Int16BE where+  swapEndian = fromIntegral . byteSwap16 . fromIntegral -instance EndianPair 8 Word64LE Word64BE where-  toLittleEndian = Word64LE . swapEndian . unWord64BE-  toBigEndian = Word64BE . swapEndian . unWord64LE+instance SwapEndian Word24 Word24LE Word24BE where+  swapEndian = byteSwap24 -instance EndianPair 8 Int64LE Int64BE where-  toLittleEndian = Int64LE . swapEndian . unInt64BE-  toBigEndian = Int64BE . swapEndian . unInt64LE+instance SwapEndian Int24 Int24LE Int24BE where+  swapEndian = fromIntegral . byteSwap24 . fromIntegral -instance EndianPair 4 FloatLE FloatBE where-  toLittleEndian = FloatLE . swapEndian . unFloatBE-  toBigEndian = FloatBE . swapEndian . unFloatLE+instance SwapEndian Word32 Word32LE Word32BE where+  swapEndian = byteSwap32 -instance EndianPair 8 DoubleLE DoubleBE where-  toLittleEndian = DoubleLE . swapEndian . unDoubleBE-  toBigEndian = DoubleBE . swapEndian . unDoubleLE+instance SwapEndian Int32 Int32LE Int32BE where+  swapEndian = fromIntegral . byteSwap32 . fromIntegral++instance SwapEndian Word64 Word64LE Word64BE where+  swapEndian = byteSwap64++instance SwapEndian Int64 Int64LE Int64BE where+  swapEndian = fromIntegral . byteSwap64 . fromIntegral++instance SwapEndian Float FloatLE FloatBE where+  swapEndian = castWord32ToFloat . byteSwap32 . castFloatToWord32++instance SwapEndian Double DoubleLE DoubleBE where+  swapEndian = castWord64ToDouble . byteSwap64 . castDoubleToWord64++newtype ViaSwapEndian x be = ViaSwapEndian {unViaSwapEndian :: be}++instance (Prim x, SwapEndian x le be) => Prim (ViaSwapEndian x be) where+  sizeOfType# _ = sizeOfType# (Proxy @x)+  sizeOf# _ = sizeOf# (undefined :: x)+  alignmentOfType# _ = alignmentOfType# (Proxy @x)+  alignment# _ = alignment# (undefined :: x)+  indexByteArray# ba i = ViaSwapEndian (coerce @x @be (swapEndian (indexByteArray# ba i)))+  readByteArray# ba i s =+    let !(# s', x #) = readByteArray# ba i s+    in  (# s', ViaSwapEndian (coerce @x @be (swapEndian x)) #)+  writeByteArray# ba i (ViaSwapEndian be) = writeByteArray# ba i (swapEndian (coerce @be @x be))+  indexOffAddr# addr i = ViaSwapEndian (coerce @x @be (swapEndian (indexOffAddr# addr i)))+  readOffAddr# addr i s =+    let !(# s', x #) = readOffAddr# addr i s+    in  (# s', ViaSwapEndian (coerce @x @be (swapEndian x)) #)+  writeOffAddr# addr i (ViaSwapEndian be) =+    writeOffAddr# addr i (swapEndian (coerce @be @x be))++instance (PrimUnaligned x, SwapEndian x le be) => PrimUnaligned (ViaSwapEndian x be) where+  indexUnalignedByteArray# ba i = ViaSwapEndian (coerce @x @be (swapEndian (indexUnalignedByteArray# ba i)))+  readUnalignedByteArray# ba i s =+    let !(# s', x #) = readUnalignedByteArray# ba i s+    in  (# s', ViaSwapEndian (coerce @x @be (swapEndian x)) #)+  writeUnalignedByteArray# ba i (ViaSwapEndian be) = writeUnalignedByteArray# ba i (swapEndian (coerce @be @x be))
src/Dahdit/Run.hs view
@@ -45,7 +45,6 @@   , PutStaticSeqF (..)   , ScopeMode (..)   )-import Dahdit.LiftedPrimArray (LiftedPrimArray (..), sizeofLiftedPrimArray) import Dahdit.Mem (ReadMem (..), WriteMem (..), readSBSMem, writeSBSMem) import Dahdit.Nums   ( DoubleBE@@ -70,12 +69,14 @@   , Word64LE   ) import Dahdit.Proxy (proxyForF)-import Dahdit.Sizes (ByteCount (..), ElemCount (..), staticByteSize)+import Dahdit.Sizes (ByteCount (..), ElemCount (..), primByteSizeOf, staticByteSize) import Data.Coerce (coerce) import Data.Foldable (for_, toList) import Data.Int (Int8) import Data.Maybe (fromJust)+import Data.Primitive.ByteArray (ByteArray (..)) import Data.Primitive.MutVar (MutVar, modifyMutVar', newMutVar, readMutVar, writeMutVar)+import Data.Primitive.PrimArray (PrimArray (..), sizeofPrimArray) import Data.Sequence (Seq (..)) import qualified Data.Sequence as Seq import Data.Text (Text)@@ -88,16 +89,16 @@ getStaticSeqSize (GetStaticSeqF ec g _) = staticByteSize (proxyForF g) * coerce ec  getStaticArraySize :: GetStaticArrayF a -> ByteCount-getStaticArraySize (GetStaticArrayF n prox _) = staticByteSize prox * coerce n+getStaticArraySize (GetStaticArrayF n prox _) = primByteSizeOf prox * coerce n  putStaticSeqSize :: PutStaticSeqF a -> ByteCount putStaticSeqSize (PutStaticSeqF n _ _ s _) = staticByteSize (proxyForF s) * coerce n  putStaticArrayElemSize :: PutStaticArrayF a -> ByteCount-putStaticArrayElemSize (PutStaticArrayF _ _ a _) = staticByteSize (proxyForF a)+putStaticArrayElemSize (PutStaticArrayF _ _ zs _) = primByteSizeOf (proxyForF zs)  putStaticArraySize :: PutStaticArrayF a -> ByteCount-putStaticArraySize (PutStaticArrayF n _ a _) = staticByteSize (proxyForF a) * coerce n+putStaticArraySize (PutStaticArrayF n _ zs _) = primByteSizeOf (proxyForF zs) * coerce n  -- Get: @@ -310,8 +311,8 @@ readStaticArray :: (MonadPrim s m, ReadMem r m) => GetStaticArrayF (GetIncM s r m a) -> GetIncM s r m a readStaticArray gsa@(GetStaticArrayF _ _ k) = do   let bc = getStaticArraySize gsa-  sa <- readBytes "static vector" bc (\mem off -> cloneArrayMemInBytes mem off bc)-  k (LiftedPrimArray sa)+  ByteArray ba <- readBytes "static vector" bc (\mem off -> cloneArrayMemInBytes mem off bc)+  k (PrimArray ba)  readLookAhead :: (MonadPrim s m, ReadMem r m) => GetLookAheadF (GetIncM s r m a) -> GetIncM s r m a readLookAhead (GetLookAheadF g k) = do@@ -430,12 +431,12 @@   k  writeStaticArray :: (WriteMem q m) => PutStaticArrayF (PutEff q m a) -> PutEff q m a-writeStaticArray psa@(PutStaticArrayF needElems mz a@(LiftedPrimArray ba) k) = do+writeStaticArray psa@(PutStaticArrayF needElems mz pa@(PrimArray ba) k) = do   let elemSize = putStaticArrayElemSize psa-      haveElems = sizeofLiftedPrimArray a-      useElems = min haveElems (coerce needElems)+      haveElems = ElemCount (sizeofPrimArray pa)+      useElems = min haveElems needElems       useBc = elemSize * coerce useElems-  writeBytes useBc (copyArrayMemInBytes ba 0 useBc)+  writeBytes useBc (copyArrayMemInBytes (ByteArray ba) 0 useBc)   let needBc = putStaticArraySize psa   unless (useBc == needBc) $ do     let extraBc = needBc - useBc
+ src/Dahdit/ShortWord.hs view
@@ -0,0 +1,232 @@+{-# HLINT ignore "Use const" #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE UnboxedTuples #-}+{-# OPTIONS_GHC -Wno-orphans #-}+{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}++-- | Exists to give orphan Prim instances to 24-bit integral types.+module Dahdit.ShortWord () where++import Data.Bits (Bits (..), shiftR)+import Data.Default (Default (..))+import Data.Primitive (Prim (..))+import Data.Primitive.ByteArray.Unaligned (PrimUnaligned (..))+import Data.ShortWord (Int24, Word24)+import Data.Word (Word8)+import GHC.Exts (Int (..), Int#, addIntC#, mulIntMayOflo#)++mkWord24 :: Word8 -> Word8 -> Word8 -> Word24+mkWord24 b0 b1 b2 =+  let !w0 = fromIntegral b0+      !w1 = shiftL (fromIntegral b1) 8+      !w2 = shiftL (fromIntegral b2) 16+      !w = w0 .|. w1 .|. w2+  in  w+{-# INLINE mkWord24 #-}++unMkWord24 :: Word24 -> (# Word8, Word8, Word8 #)+unMkWord24 w =+  let !b0 = fromIntegral (w .&. 255)+      !b1 = fromIntegral (shiftR w 8 .&. 255)+      !b2 = fromIntegral (shiftR w 16 .&. 255)+      !bs = (# b0, b1, b2 #)+  in  bs+{-# INLINE unMkWord24 #-}++mkInt24 :: Word8 -> Word8 -> Word8 -> Int24+mkInt24 b0 b1 b2 =+  let !w0 = fromIntegral b0+      !w1 = shiftL (fromIntegral b1) 8+      !w2 = shiftL (fromIntegral b2) 16+      !w = w0 .|. w1 .|. w2+  in  w+{-# INLINE mkInt24 #-}++unMkInt24 :: Int24 -> (# Word8, Word8, Word8 #)+unMkInt24 w =+  let !b0 = fromIntegral (w .&. 255)+      !b1 = fromIntegral (shiftR w 8 .&. 255)+      !b2 = fromIntegral (shiftR w 16 .&. 255)+      !bs = (# b0, b1, b2 #)+  in  bs+{-# INLINE unMkInt24 #-}++k3 :: a -> Int#+k3 = let !(I# i) = 3 in \_ -> i+{-# INLINE k3 #-}++x3 :: Int# -> Int#+x3 =+  let !(I# three) = 3+  in  mulIntMayOflo# three+{-# INLINE x3 #-}++x3p1 :: Int# -> Int#+x3p1 =+  let !(I# three) = 3+      !(I# one) = 1+  in  \i ->+        let !(# x, _ #) = addIntC# one (mulIntMayOflo# three i)+        in  x+{-# INLINE x3p1 #-}++x3p2 :: Int# -> Int#+x3p2 =+  let !(I# three) = 3+      !(I# two) = 2+  in  \i ->+        let !(# x, _ #) = addIntC# two (mulIntMayOflo# three i)+        in  x+{-# INLINE x3p2 #-}++p1 :: Int# -> Int#+p1 =+  let !(I# one) = 1+  in  \i ->+        let !(# x, _ #) = addIntC# one i+        in  x+{-# INLINE p1 #-}++p2 :: Int# -> Int#+p2 =+  let !(I# two) = 2+  in  \i ->+        let !(# x, _ #) = addIntC# two i+        in  x+{-# INLINE p2 #-}++instance Default Word24 where+  def = 0++instance Default Int24 where+  def = 0++instance Prim Word24 where+  sizeOfType# = k3+  sizeOf# = k3+  alignmentOfType# = k3+  alignment# = k3+  indexByteArray# a i =+    let !b0 = indexByteArray# a (x3 i)+        !b1 = indexByteArray# a (x3p1 i)+        !b2 = indexByteArray# a (x3p2 i)+        !w = mkWord24 b0 b1 b2+    in  w+  readByteArray# a i s =+    let !(# s0, b0 #) = readByteArray# a (x3 i) s+        !(# s1, b1 #) = readByteArray# a (x3p1 i) s0+        !(# s2, b2 #) = readByteArray# a (x3p2 i) s1+        !w = mkWord24 b0 b1 b2+        !t = (# s2, w #)+    in  t+  writeByteArray# a i w s =+    let !(# b0, b1, b2 #) = unMkWord24 w+        !s0 = writeByteArray# a (x3 i) b0 s+        !s1 = writeByteArray# a (x3p1 i) b1 s0+        !s2 = writeByteArray# a (x3p2 i) b2 s1+    in  s2+  indexOffAddr# a i =+    let !b0 = indexOffAddr# a (x3 i)+        !b1 = indexOffAddr# a (x3p1 i)+        !b2 = indexOffAddr# a (x3p2 i)+        !w = mkWord24 b0 b1 b2+    in  w+  readOffAddr# a i s =+    let !(# s0, b0 #) = readOffAddr# a (x3 i) s+        !(# s1, b1 #) = readOffAddr# a (x3p1 i) s0+        !(# s2, b2 #) = readOffAddr# a (x3p2 i) s1+        !w = mkWord24 b0 b1 b2+        !t = (# s2, w #)+    in  t+  writeOffAddr# a i w s =+    let !(# b0, b1, b2 #) = unMkWord24 w+        !s0 = writeOffAddr# a (x3 i) b0 s+        !s1 = writeOffAddr# a (x3p1 i) b1 s0+        !s2 = writeOffAddr# a (x3p2 i) b2 s1+    in  s2++instance Prim Int24 where+  sizeOfType# = k3+  sizeOf# = k3+  alignmentOfType# = k3+  alignment# = k3+  indexByteArray# a i =+    let !b0 = indexByteArray# a (x3 i)+        !b1 = indexByteArray# a (x3p1 i)+        !b2 = indexByteArray# a (x3p2 i)+        !w = mkInt24 b0 b1 b2+    in  w+  readByteArray# a i s =+    let !(# s0, b0 #) = readByteArray# a (x3 i) s+        !(# s1, b1 #) = readByteArray# a (x3p1 i) s0+        !(# s2, b2 #) = readByteArray# a (x3p2 i) s1+        !w = mkInt24 b0 b1 b2+        !t = (# s2, w #)+    in  t+  writeByteArray# a i w s =+    let !(# b0, b1, b2 #) = unMkInt24 w+        !s0 = writeByteArray# a (x3 i) b0 s+        !s1 = writeByteArray# a (x3p1 i) b1 s0+        !s2 = writeByteArray# a (x3p2 i) b2 s1+    in  s2+  indexOffAddr# a i =+    let !b0 = indexOffAddr# a (x3 i)+        !b1 = indexOffAddr# a (x3p1 i)+        !b2 = indexOffAddr# a (x3p2 i)+        !w = mkInt24 b0 b1 b2+    in  w+  readOffAddr# a i s =+    let !(# s0, b0 #) = readOffAddr# a (x3 i) s+        !(# s1, b1 #) = readOffAddr# a (x3p1 i) s0+        !(# s2, b2 #) = readOffAddr# a (x3p2 i) s1+        !w = mkInt24 b0 b1 b2+        !t = (# s2, w #)+    in  t+  writeOffAddr# a i w s =+    let !(# b0, b1, b2 #) = unMkInt24 w+        !s0 = writeOffAddr# a (x3 i) b0 s+        !s1 = writeOffAddr# a (x3p1 i) b1 s0+        !s2 = writeOffAddr# a (x3p2 i) b2 s1+    in  s2++instance PrimUnaligned Word24 where+  indexUnalignedByteArray# a i =+    let !b0 = indexByteArray# a i+        !b1 = indexByteArray# a (p1 i)+        !b2 = indexByteArray# a (p2 i)+        !w = mkWord24 b0 b1 b2+    in  w+  readUnalignedByteArray# a i s =+    let !(# s0, b0 #) = readByteArray# a i s+        !(# s1, b1 #) = readByteArray# a (p1 i) s0+        !(# s2, b2 #) = readByteArray# a (p2 i) s1+        !w = mkWord24 b0 b1 b2+        !t = (# s2, w #)+    in  t+  writeUnalignedByteArray# a i w s =+    let !(# b0, b1, b2 #) = unMkWord24 w+        !s0 = writeByteArray# a i b0 s+        !s1 = writeByteArray# a (p1 i) b1 s0+        !s2 = writeByteArray# a (p2 i) b2 s1+    in  s2++instance PrimUnaligned Int24 where+  indexUnalignedByteArray# a i =+    let !b0 = indexByteArray# a i+        !b1 = indexByteArray# a (p1 i)+        !b2 = indexByteArray# a (p2 i)+        !w = mkInt24 b0 b1 b2+    in  w+  readUnalignedByteArray# a i s =+    let !(# s0, b0 #) = readByteArray# a i s+        !(# s1, b1 #) = readByteArray# a (p1 i) s0+        !(# s2, b2 #) = readByteArray# a (p2 i) s1+        !w = mkInt24 b0 b1 b2+        !t = (# s2, w #)+    in  t+  writeUnalignedByteArray# a i w s =+    let !(# b0, b1, b2 #) = unMkInt24 w+        !s0 = writeByteArray# a i b0 s+        !s1 = writeByteArray# a (p1 i) b1 s0+        !s2 = writeByteArray# a (p2 i) b2 s1+    in  s2
src/Dahdit/Sizes.hs view
@@ -6,10 +6,11 @@   , StaticByteSized (..)   , staticByteSizeFoldable   , byteSizeViaStatic+  , primByteSize+  , primByteSizeOf   ) where -import Dahdit.Internal (ViaEndianPair (..), ViaFromIntegral (..)) import Dahdit.Nums   ( DoubleBE   , DoubleLE@@ -36,6 +37,7 @@ import Data.Coerce (coerce) import Data.Default (Default) import Data.Int (Int16, Int32, Int64, Int8)+import Data.Primitive (Prim, sizeOf, sizeOfType) import Data.Proxy (Proxy (..)) import Data.ShortWord (Int24, Word24) import Data.Word (Word16, Word32, Word64, Word8)@@ -47,12 +49,21 @@   deriving stock (Show)   deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Default) +instance Bounded ByteCount where+  minBound = 0+  maxBound = ByteCount maxBound+ newtype ElemCount = ElemCount {unElemCount :: Int}   deriving stock (Show)   deriving newtype (Eq, Ord, Num, Enum, Real, Integral, Default) +instance Bounded ElemCount where+  minBound = 0+  maxBound = ElemCount maxBound+ -- StaticByteSized +-- | For types with 'Prim' instances, this will match 'sizeOfType'. class (KnownNat (StaticSize a)) => StaticByteSized a where   type StaticSize a :: Nat   staticByteSize :: Proxy a -> ByteCount@@ -165,36 +176,54 @@   type StaticSize DoubleLE = 8   staticByteSize _ = 8 -instance (StaticByteSized x, n ~ StaticSize x) => StaticByteSized (ViaFromIntegral n x y) where-  type StaticSize (ViaFromIntegral n x y) = n-  staticByteSize _ = staticByteSize (Proxy :: Proxy x)--instance (StaticByteSized le, n ~ StaticSize le) => StaticByteSized (ViaEndianPair n le be) where-  type StaticSize (ViaEndianPair n le be) = n-  staticByteSize _ = staticByteSize (Proxy :: Proxy le)--deriving via (ViaEndianPair 2 Word16LE Word16BE) instance StaticByteSized Word16BE+instance StaticByteSized Word16BE where+  type StaticSize Word16BE = 2+  staticByteSize _ = 2 -deriving via (ViaEndianPair 2 Int16LE Int16BE) instance StaticByteSized Int16BE+instance StaticByteSized Int16BE where+  type StaticSize Int16BE = 2+  staticByteSize _ = 2 -deriving via (ViaEndianPair 3 Word24LE Word24BE) instance StaticByteSized Word24BE+instance StaticByteSized Word24BE where+  type StaticSize Word24BE = 3+  staticByteSize _ = 3 -deriving via (ViaEndianPair 3 Int24LE Int24BE) instance StaticByteSized Int24BE+instance StaticByteSized Int24BE where+  type StaticSize Int24BE = 3+  staticByteSize _ = 3 -deriving via (ViaEndianPair 4 Word32LE Word32BE) instance StaticByteSized Word32BE+instance StaticByteSized Word32BE where+  type StaticSize Word32BE = 4+  staticByteSize _ = 4 -deriving via (ViaEndianPair 4 Int32LE Int32BE) instance StaticByteSized Int32BE+instance StaticByteSized Int32BE where+  type StaticSize Int32BE = 4+  staticByteSize _ = 4 -deriving via (ViaEndianPair 8 Word64LE Word64BE) instance StaticByteSized Word64BE+instance StaticByteSized Word64BE where+  type StaticSize Word64BE = 8+  staticByteSize _ = 8 -deriving via (ViaEndianPair 8 Int64LE Int64BE) instance StaticByteSized Int64BE+instance StaticByteSized Int64BE where+  type StaticSize Int64BE = 8+  staticByteSize _ = 8 -deriving via (ViaEndianPair 4 FloatLE FloatBE) instance StaticByteSized FloatBE+instance StaticByteSized FloatBE where+  type StaticSize FloatBE = 4+  staticByteSize _ = 4 -deriving via (ViaEndianPair 8 DoubleLE DoubleBE) instance StaticByteSized DoubleBE+instance StaticByteSized DoubleBE where+  type StaticSize DoubleBE = 8+  staticByteSize _ = 8  staticByteSizeFoldable :: (Foldable f, StaticByteSized a) => f a -> ByteCount staticByteSizeFoldable fa = staticByteSize (proxyForF fa) * coerce (length fa)  byteSizeViaStatic :: (StaticByteSized a) => a -> ByteCount byteSizeViaStatic = staticByteSize . proxyFor++primByteSize :: (Prim a) => a -> ByteCount+primByteSize = ByteCount . sizeOf++primByteSizeOf :: forall a. (Prim a) => Proxy a -> ByteCount+primByteSizeOf _ = ByteCount (sizeOfType @a)
test/Main.hs view
@@ -29,7 +29,6 @@   , Int32LE   , Int64BE   , Int64LE-  , LiftedPrimArray (..)   , MutBinaryPutTarget (..)   , Proxy (..)   , Put@@ -67,8 +66,8 @@   , getInt64BE   , getInt64LE   , getInt8-  , getLiftedPrimArray   , getLookAhead+  , getPrimArray   , getRemainingSize   , getSeq   , getSkip@@ -86,8 +85,6 @@   , getWord64BE   , getWord64LE   , getWord8-  , lengthLiftedPrimArray-  , liftedPrimArrayFromList   , mutPutTarget   , mutPutTargetOffset   , putByteArray@@ -105,7 +102,7 @@   , putInt64BE   , putInt64LE   , putInt8-  , putLiftedPrimArray+  , putPrimArray   , putSeq   , putStaticArray   , putStaticSeq@@ -120,7 +117,6 @@   , putWord64LE   , putWord8   , runCount-  , sizeofLiftedPrimArray   ) import qualified Data.ByteString as BS import qualified Data.ByteString.Char8 as BSC@@ -137,6 +133,7 @@   , getSizeofMutableByteArray   , newByteArray   )+import Data.Primitive.PrimArray (primArrayFromList) import Data.Proxy (asProxyTypeOf) import Data.Sequence (Seq (..)) import qualified Data.Sequence as Seq@@ -362,8 +359,12 @@   , GetCase "Int64LE" getInt64LE (Just (8, 0, 0x5DEC6EFD12345678)) [0x78, 0x56, 0x34, 0x12, 0xFD, 0x6E, 0xEC, 0x5D]   , GetCase "Int64BE" getInt64BE (Just (8, 0, 0x5DEC6EFD12345678)) [0x5D, 0xEC, 0x6E, 0xFD, 0x12, 0x34, 0x56, 0x78]   , GetCase "FloatLE" getFloatLE (Just (4, 0, FloatLE (castWord32ToFloat 0x5DEC6EFD))) [0xFD, 0x6E, 0xEC, 0x5D]-  , GetCase "FloatBE" getFloatBE (Just (4, 0, FloatBE (castWord32ToFloat 0x5DEC6EFD))) [0x5D, 0xEC, 0x6E, 0xFD]   , GetCase+      "FloatBE"+      getFloatBE+      (Just (4, 0, FloatBE (castWord32ToFloat 0x5DEC6EFD)))+      [0x5D, 0xEC, 0x6E, 0xFD]+  , GetCase       "DoubleLE"       getDoubleLE       (Just (8, 0, DoubleLE (castWord64ToDouble 0x5DEC6EFD12345678)))@@ -377,12 +378,13 @@   , GetCase "Text" (getText 2) (Just (2, 1, "hi")) [0x68, 0x69, 0xBB]   , GetCase "Two Word8" ((,) <$> getWord8 <*> getWord8) (Just (2, 0, (0x5D, 0xBB))) [0x5D, 0xBB]   , GetCase "Two Word16LE" ((,) <$> getWord16LE <*> getWord16LE) (Just (4, 0, (0x5DEC, 0x4020))) [0xEC, 0x5D, 0x20, 0x40]+  , GetCase "Two Word16BE" ((,) <$> getWord16BE <*> getWord16BE) (Just (4, 0, (0x5DEC, 0x4020))) [0x5D, 0xEC, 0x40, 0x20]   , GetCase "Seq" (getSeq 2 getWord16LE) (Just (4, 0, Seq.fromList [0x5DEC, 0x4020])) [0xEC, 0x5D, 0x20, 0x40]   , GetCase "StaticSeq" (getStaticSeq 2 getWord16LE) (Just (4, 0, Seq.fromList [0x5DEC, 0x4020])) [0xEC, 0x5D, 0x20, 0x40]   , GetCase       "StaticArray"       (getStaticArray @Word16LE 2)-      (Just (4, 0, liftedPrimArrayFromList [0x5DEC, 0x4020]))+      (Just (4, 0, primArrayFromList [0x5DEC, 0x4020]))       [0xEC, 0x5D, 0x20, 0x40]   , GetCase "DynFoo" (get @DynFoo) (Just (3, 0, DynFoo 0xBB 0x5DEC)) [0xBB, 0xEC, 0x5D]   , GetCase "StaFoo" (get @StaFoo) (Just (3, 0, StaFoo 0xBB 0x5DEC)) [0xBB, 0xEC, 0x5D]@@ -405,9 +407,9 @@       (Just (3, 1, byteArrayFromList @Word8 [0xFD, 0x6E, 0xEC]))       [0xFD, 0x6E, 0xEC, 0x5D]   , GetCase-      "getLiftedPrimArray"-      (getLiftedPrimArray (Proxy :: Proxy Word16LE) 3)-      (Just (6, 1, liftedPrimArrayFromList @Word16LE [0xFD, 0x6E, 0xEC]))+      "getPrimArray"+      (getPrimArray (Proxy :: Proxy Word16LE) 3)+      (Just (6, 1, primArrayFromList @Word16LE [0xFD, 0x6E, 0xEC]))       [0xFD, 0x00, 0x6E, 0x00, 0xEC, 0x00, 0x5D]   , GetCase "StaBytes" (get @StaBytes) (Just (2, 1, mkStaBytes "hi")) [0x68, 0x69, 0x21]   , GetCase "TagFoo (one)" (get @TagFoo) (Just (2, 0, TagFooOne 7)) [0x00, 0x07]@@ -471,15 +473,15 @@   , PutCase "Two Word16LE" (putWord16LE 0x5DEC *> putWord16LE 0x4020) [0xEC, 0x5D, 0x20, 0x40]   , PutCase "Seq" (putSeq putWord16LE (Seq.fromList [0x5DEC, 0x4020])) [0xEC, 0x5D, 0x20, 0x40]   , PutCase "StaticSeq" (putStaticSeq putWord16LE (Seq.fromList [0x5DEC, 0x4020])) [0xEC, 0x5D, 0x20, 0x40]-  , PutCase "StaticArray" (putStaticArray @Word16LE (liftedPrimArrayFromList [0x5DEC, 0x4020])) [0xEC, 0x5D, 0x20, 0x40]+  , PutCase "StaticArray" (putStaticArray @Word16LE (primArrayFromList [0x5DEC, 0x4020])) [0xEC, 0x5D, 0x20, 0x40]   , PutCase "DynFoo" (put (DynFoo 0xBB 0x5DEC)) [0xBB, 0xEC, 0x5D]   , PutCase "StaFoo" (put (StaFoo 0xBB 0x5DEC)) [0xBB, 0xEC, 0x5D]   , PutCase "BoolByte True" (put (BoolByte True)) [0x01]   , PutCase "BoolByte False" (put (BoolByte False)) [0x00]   , PutCase "putByteArray" (putByteArray (byteArrayFromList @Word8 [0xFD, 0x6E, 0xEC])) [0xFD, 0x6E, 0xEC]   , PutCase-      "putLiftedPrimArray"-      (putLiftedPrimArray (liftedPrimArrayFromList @Word16LE [0xFD, 0x6E, 0xEC]))+      "putPrimArray"+      (putPrimArray (primArrayFromList @Word16LE [0xFD, 0x6E, 0xEC]))       [0xFD, 0x00, 0x6E, 0x00, 0xEC, 0x00]   , PutCase "StaBytes" (put (mkStaBytes "hi")) [0x68, 0x69]   , PutCase "StaBytes (less)" (put (mkStaBytes "h")) [0x68, 0x00]@@ -522,13 +524,6 @@ testPut :: (BinaryPutTarget z IO, CaseTarget z) => String -> Proxy z -> TestTree testPut n p = testGroup ("put (" ++ n ++ ")") (fmap (runPutCase p) putCases) -testLiftedPrimArray :: TestTree-testLiftedPrimArray = testUnit "liftedPrimArray" $ do-  let arr = LiftedPrimArray (byteArrayFromList @Word8 [0xFD, 0x00, 0x6E, 0x00, 0xEC, 0x00]) :: LiftedPrimArray Word16LE-  liftedPrimArrayFromList [0xFD, 0x6E, 0xEC] === arr-  sizeofLiftedPrimArray arr === 6-  lengthLiftedPrimArray arr === 3- testGetOffset :: (BinaryGetTarget z IO, CaseTarget z) => String -> Proxy z -> TestTree testGetOffset n p = testUnit ("get offset (" ++ n ++ ")") $ do   let buf = [0x12, 0x34, 0x56, 0x78]@@ -669,7 +664,7 @@ testDahdit lim = testGroup "Dahdit" trees  where   trees = baseTrees ++ targetTrees ++ mutTargetTrees-  baseTrees = [testByteSize, testStaticByteSize, testLiftedPrimArray]+  baseTrees = [testByteSize, testStaticByteSize]   targetTrees =     targets >>= \(TargetDef name prox) ->       [ testGet name prox