primitive-extras 0.1.9 → 0.1.10
raw patch · 4 files changed
+72/−1 lines, 4 filesdep +cerealPVP ok
version bump matches the API change (PVP)
Dependencies added: cereal
API changes (from Hackage documentation)
+ PrimitiveExtras.Cereal.Get: primArray :: Prim element => Get element -> Get (PrimArray element)
+ PrimitiveExtras.Cereal.Get: primMultiArray :: Prim element => Get element -> Get (PrimMultiArray element)
+ PrimitiveExtras.Cereal.Put: primArray :: Prim element => Putter element -> Putter (PrimArray element)
+ PrimitiveExtras.Cereal.Put: primMultiArray :: Prim element => Putter element -> Putter (PrimMultiArray element)
+ PrimitiveExtras.Monad: replicateMMultiPrimArray :: (Monad m, Prim a) => Int -> m (PrimArray a) -> m (PrimMultiArray a)
+ PrimitiveExtras.Monad: traverseUnliftedArray_ :: (Monad m, PrimUnlifted a) => (a -> m ()) -> UnliftedArray a -> m ()
Files
- library/PrimitiveExtras/Cereal/Get.hs +20/−0
- library/PrimitiveExtras/Cereal/Put.hs +22/−0
- library/PrimitiveExtras/Monad.hs +26/−0
- primitive-extras.cabal +4/−1
+ library/PrimitiveExtras/Cereal/Get.hs view
@@ -0,0 +1,20 @@+module PrimitiveExtras.Cereal.Get+where++import PrimitiveExtras.Prelude+import PrimitiveExtras.Types+import Data.Serialize.Get+import PrimitiveExtras.Monad+++primArray :: Prim element => Get element -> Get (PrimArray element)+primArray element =+ do+ size <- fromIntegral <$> getInt64le+ replicateMPrimArray size element++primMultiArray :: Prim element => Get element -> Get (PrimMultiArray element)+primMultiArray element =+ do+ size <- fromIntegral <$> getInt64le+ replicateMMultiPrimArray size (primArray element)
+ library/PrimitiveExtras/Cereal/Put.hs view
@@ -0,0 +1,22 @@+module PrimitiveExtras.Cereal.Put+where++import PrimitiveExtras.Prelude+import PrimitiveExtras.Types+import Data.Serialize.Put+import qualified PrimitiveExtras.Monad as Monad+++primArray :: Prim element => Putter element -> Putter (PrimArray element)+primArray element primArrayValue =+ size <> elements+ where+ size = putInt64le (fromIntegral (sizeofPrimArray primArrayValue))+ elements = traversePrimArray_ element primArrayValue++primMultiArray :: Prim element => Putter element -> Putter (PrimMultiArray element)+primMultiArray element (PrimMultiArray outerArrayValue) =+ size <> innerArrays+ where+ size = putInt64le (fromIntegral (sizeofUnliftedArray outerArrayValue))+ innerArrays = Monad.traverseUnliftedArray_ (primArray element) outerArrayValue
library/PrimitiveExtras/Monad.hs view
@@ -14,6 +14,20 @@ indexCounts <- runFold (lmap fst (A.indexCounts outerArraySize)) runFold (A.primMultiArray (indexCounts :: PrimArray Word32)) +replicateMMultiPrimArray :: (Monad m, Prim a) => Int -> m (PrimArray a) -> m (PrimMultiArray a)+replicateMMultiPrimArray size elementM =+ do+ !mutable <- return (unsafeDupablePerformIO (unsafeNewUnliftedArray size))+ let + iterate index =+ if index < size+ then do+ element <- elementM+ let !() = unsafeDupablePerformIO (writeUnliftedArray mutable index element)+ iterate (succ index)+ else return (PrimMultiArray (unsafePerformIO (unsafeFreezeUnliftedArray mutable)))+ in iterate 0+ {-| Please notice that this function is highly untested -} replicateMPrimArray :: (Monad m, Prim element) => Int -> m element -> m (PrimArray element) replicateMPrimArray size elementM =@@ -28,3 +42,15 @@ iterate (succ index) else return (unsafePerformIO (unsafeFreezePrimArray mutable)) in iterate 0++traverseUnliftedArray_ :: (Monad m, PrimUnlifted a) => (a -> m ()) -> UnliftedArray a -> m ()+traverseUnliftedArray_ action array =+ let+ size = sizeofUnliftedArray array+ iterate index = if index < size+ then do+ element <- indexUnliftedArrayM array index+ action element+ iterate (succ index)+ else return ()+ in iterate 0
primitive-extras.cabal view
@@ -1,7 +1,7 @@ name: primitive-extras version:- 0.1.9+ 0.1.10 category: Primitive synopsis:@@ -46,12 +46,15 @@ PrimitiveExtras.UnfoldM PrimitiveExtras.Fold PrimitiveExtras.Pure+ PrimitiveExtras.Cereal.Get+ PrimitiveExtras.Cereal.Put other-modules: PrimitiveExtras.UnliftedArray PrimitiveExtras.Prelude PrimitiveExtras.Types build-depends: base >=4.7 && <5,+ cereal >=0.5.5 && <0.6, deferred-folds >=0.6 && <0.7, foldl >=1 && <2, primitive >=0.6.4 && <0.7,