packages feed

hw-prim 0.6.2.31 → 0.6.2.32

raw patch · 2 files changed

+30/−5 lines, 2 filesPVP: minor bump suggested

API additions: PVP suggests at least a minor version bump

API changes (from Hackage documentation)

+ HaskellWorks.Data.Vector.Storable: construct64UnzipN :: Int -> [(ByteString, ByteString)] -> (Vector Word64, Vector Word64)

Files

hw-prim.cabal view
@@ -1,7 +1,7 @@ cabal-version:  2.2  name:           hw-prim-version:        0.6.2.31+version:        0.6.2.32 synopsis:       Primitive functions and data types description:    Primitive functions and data types. category:       Data
src/HaskellWorks/Data/Vector/Storable.hs view
@@ -9,15 +9,18 @@   , mmap   , constructSI   , construct2N+  , construct64UnzipN   ) where -import Control.Monad.ST     (ST, runST)-import Data.Monoid          (Monoid (..), (<>))-import Data.Vector.Storable (Storable)+import Control.Monad.ST                   (ST, runST)+import Data.Monoid                        (Monoid (..), (<>))+import Data.Vector.Storable               (Storable) import Data.Word import Foreign.ForeignPtr-import Prelude              hiding (foldMap)+import HaskellWorks.Data.Vector.AsVector8+import Prelude                            hiding (foldMap) +import qualified Data.ByteString              as BS import qualified Data.Vector.Generic          as DVG import qualified Data.Vector.Storable         as DVS import qualified Data.Vector.Storable.Mutable as DVSM@@ -101,3 +104,25 @@           bi <- fb' d (DVSM.drop bn mbs)           ci <- fc' d (DVSM.drop cn mcs)           go fb' (bn + bi) mbs fc' (cn + ci) mcs ds++construct64UnzipN :: Int -> [(BS.ByteString, BS.ByteString)] -> (DVS.Vector Word64, DVS.Vector Word64)+construct64UnzipN nBytes xs = (DVS.unsafeCast ibv, DVS.unsafeCast bpv)+  where [ibv, bpv] = DVS.createT $ do+          let nW64s     = (nBytes + 7) `div` 8+          let capacity  = nW64s * 8+          ibmv <- DVSM.new capacity+          bpmv <- DVSM.new capacity+          (ibmvRemaining, bpmvRemaining) <- go ibmv bpmv xs+          return+            [ DVSM.take (((DVSM.length ibmv - ibmvRemaining) `div` 8) * 8) ibmv+            , DVSM.take (((DVSM.length bpmv - bpmvRemaining) `div` 8) * 8) bpmv+            ]+        go :: DVSM.MVector s Word8 -> DVSM.MVector s Word8 -> [(BS.ByteString, BS.ByteString)] -> ST s (Int, Int)+        go ibmv bpmv ((ib, bp):ys) = do+          DVS.copy (DVSM.take (BS.length ib) ibmv) (asVector8 ib)+          DVS.copy (DVSM.take (BS.length bp) bpmv) (asVector8 bp)+          go (DVSM.drop (BS.length ib) ibmv) (DVSM.drop (BS.length bp) bpmv) ys+        go ibmv bpmv [] = do+          DVSM.set (DVSM.take 8 ibmv) 0+          DVSM.set (DVSM.take 8 bpmv) 0+          return (DVSM.length (DVSM.drop 8 ibmv), DVSM.length (DVSM.drop 8 bpmv))