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 +2/−1
- src/Data/Primitive/PrimArray.hs +14/−7
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 #-}