packages feed

prim-array 0.2.1 → 0.2.2

raw patch · 2 files changed

+16/−8 lines, 2 filesdep +semigroups

Dependencies added: semigroups

Files

prim-array.cabal view
@@ -1,5 +1,5 @@ name: prim-array-version: 0.2.1+version: 0.2.2 synopsis: Primitive byte array with type variable homepage: https://github.com/andrewthad/prim-array#readme license: BSD3@@ -21,6 +21,7 @@       base >= 4.9 && < 5     , primitive >= 0.6 && < 0.7     , ghc-prim >= 0.5 && < 0.6+    , semigroups   default-language: Haskell2010  source-repository head
src/Data/Primitive/PrimArray.hs view
@@ -42,6 +42,8 @@ import Data.Primitive import Control.Monad.Primitive import Control.Monad.ST+import Data.Semigroup (Semigroup(..))+import qualified Data.Semigroup as SG import qualified Data.List as L import qualified Data.Primitive.Types as PT @@ -88,19 +90,24 @@     then indexPrimArray arr ix : go (ix + 1)     else [] +appendPrimArray :: Prim a => PrimArray a -> PrimArray a -> PrimArray a +appendPrimArray a b = runST $ do+  let szA = sizeofPrimArray a+  let szB = sizeofPrimArray b+  c <- newPrimArray (szA + szB)+  copyPrimArray c 0 a 0 szA+  copyPrimArray c szA b 0 szB+  unsafeFreezePrimArray c +instance Prim a => Semigroup (PrimArray a) where+  (<>) = appendPrimArray+ -- It is actually possible to write this without the Prim constraint -- on the type variable a. You just copy the byte arrays using -- more primitive operations. instance Prim a => Monoid (PrimArray a) where   mempty = emptyPrimArray-  mappend a b = runST $ do-    let szA = sizeofPrimArray a-    let szB = sizeofPrimArray b-    c <- newPrimArray (szA + szB)-    copyPrimArray c 0 a 0 szA-    copyPrimArray c szA b 0 szB-    unsafeFreezePrimArray c+  mappend = (SG.<>)  emptyPrimArray :: PrimArray a {-# NOINLINE emptyPrimArray #-}