primdata 0.1.2.2 → 0.1.2.3
raw patch · 5 files changed
+84/−7 lines, 5 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Data.Array.FM: copySlice :: Flat a => Array a -> Int -> Array a -> Int -> Int -> IO ()
+ Data.Array.FM: forIx :: Flat a => Array a -> (Int -> a -> IO ()) -> IO ()
+ Data.Array.FM: freeze :: Array a -> IO (Array a)
+ Data.Array.FM: freezeSlice :: Flat a => Array a -> Int -> Int -> IO (Array a)
+ Data.Array.FM: sizedThaw :: Flat a => Int -> Array a -> IO (Array a)
+ Data.Array.FM: thawSlice :: Flat a => Array a -> Int -> Int -> IO (Array a)
+ Data.Array.LM: forIx :: Array a -> (Int -> a -> IO ()) -> IO ()
+ Data.Array.SM: forIx :: Array a -> (Int -> a -> IO ()) -> IO ()
+ Data.Array.UM: forIx :: Unlifted a => Array a -> (Int -> a -> IO ()) -> IO ()
Files
- Data/Array/FM.hs +50/−6
- Data/Array/LM.hs +11/−0
- Data/Array/SM.hs +11/−0
- Data/Array/UM.hs +11/−0
- primdata.cabal +1/−1
Data/Array/FM.hs view
@@ -49,12 +49,6 @@ isPinned (Array arr) = isTrue# (isMutableByteArrayPinned# arr) {-# inline isPinned #-} --- contents :: forall r a (b :: TYPE r). Array a -> (Addr# -> b) -> b--- contents (Array arr) cont = case isMutableByteArrayPinned# arr of--- 1# -> runRW# \s -> keepAlive# arr s \s -> cont (mutableByteArrayContents# arr)--- _ -> unpinnedContents--- {-# inline contents #-}- empty :: Array a empty = Array (runRW# \s -> case newByteArray# 0# s of (# s, arr #) -> arr)@@ -109,6 +103,18 @@ in go arr 0# (sizeofMutableByteArray# arr) s {-# inline for #-} +forIx :: forall a. Flat a => Array a -> (Int -> a -> IO ()) -> IO ()+forIx (Array arr) f = IO \s ->+ let go arr i n !ix s = case i ==# n of+ 1# -> (# s, () #)+ _ -> case readWord8ArrayAs# arr i s of+ (# s, a #) -> case a of+ !a -> case f ix a of+ IO f -> case f s of+ (# s, _ #) -> go arr (i +# size# @a proxy#) n (ix + 1) s+ in go arr 0# (sizeofMutableByteArray# arr) 0 s+{-# inline forIx #-}+ set :: forall a. Flat a => Array a -> a -> IO () set (Array arr) a = IO \s -> let go arr i n s = case i ==# n of@@ -122,6 +128,15 @@ size (Array arr) = I# (fromByteOffset# @a proxy# (sizeofMutableByteArray# arr)) {-# inline size #-} +thawSlice :: forall a. Flat a => FI.Array a -> Int -> Int -> IO (Array a)+thawSlice (FI.Array arr) (I# start) (I# len) =+ let len' = toByteOffset# (proxy# :: Proxy# a) len+ start' = toByteOffset# (proxy# :: Proxy# a) start+ in IO \s -> case newByteArray# len' s of+ (# s, marr #) -> case copyByteArray# arr start' marr 0# len' s of+ s -> (# s, Array marr #)+{-# inline thawSlice #-}+ thaw :: forall a. FI.Array a -> IO (Array a) thaw (FI.Array arr) = let n = sizeofByteArray# arr@@ -130,7 +145,36 @@ s -> (# s, Array marr #) {-# inline thaw #-} +copySlice :: forall a. Flat a => Array a -> Int -> Array a -> Int -> Int -> IO ()+copySlice (Array src) (I# i) (Array dst) (I# j) (I# len) = IO \s ->+ let i' = toByteOffset# (proxy# :: Proxy# a) i+ j' = toByteOffset# (proxy# :: Proxy# a) j+ len' = toByteOffset# (proxy# :: Proxy# a) len+ in case copyMutableByteArray# src i' dst j' len' s of+ s -> (# s, () #)+{-# inline copySlice #-}++sizedThaw :: forall a. Flat a => Int -> FI.Array a -> IO (Array a)+sizedThaw size arr = thawSlice arr 0 size+{-# inline sizedThaw #-}+ unsafeFreeze :: Array a -> IO (FI.Array a) unsafeFreeze (Array marr) = IO \s -> case unsafeFreezeByteArray# marr s of (# s, arr #) -> (# s, FI.Array arr #) {-# inline unsafeFreeze #-}++freezeSlice :: forall a. Flat a => Array a -> Int -> Int -> IO (FI.Array a)+freezeSlice src start len = do+ dst <- new @a len+ copySlice @a src start dst 0 len+ unsafeFreeze dst+{-# inline freezeSlice #-}++freeze :: Array a -> IO (FI.Array a)+freeze (Array arr) = IO \s ->+ let len = sizeofMutableByteArray# arr+ in case newByteArray# len s of+ (# s, marr #) -> case copyMutableByteArrayNonOverlapping# arr 0# marr 0# len s of+ s -> case unsafeFreezeByteArray# marr s of+ (# s, arr #) -> (# s, FI.Array arr #)+{-# inline freeze #-}
Data/Array/LM.hs view
@@ -77,6 +77,17 @@ in go arr 0# (sizeofMutableArray# arr) s {-# inline for #-} +forIx :: forall a. Array a -> (Int -> a -> IO ()) -> IO ()+forIx (Array arr) f = IO \s ->+ let go arr i n s = case i ==# n of+ 1# -> (# s, () #)+ _ -> case readArray# arr i s of+ (# s, a #) -> case f (I# i) a of+ IO f -> case f s of+ (# s, _ #) -> go arr (i +# 1#) n s+ in go arr 0# (sizeofMutableArray# arr) s+{-# inline forIx #-}+ set :: forall a. Array a -> a -> IO () set arr a = map' (\_ -> a) arr {-# inline set #-}
Data/Array/SM.hs view
@@ -84,6 +84,17 @@ in go arr 0# (sizeofSmallMutableArray# arr) s {-# inline for #-} +forIx :: forall a. Array a -> (Int -> a -> IO ()) -> IO ()+forIx (Array arr) f = IO \s ->+ let go arr i n s = case i ==# n of+ 1# -> (# s, () #)+ _ -> case readSmallArray# arr i s of+ (# s, a #) -> case f (I# i) a of+ IO f -> case f s of+ (# s, _ #) -> go arr (i +# 1#) n s+ in go arr 0# (sizeofSmallMutableArray# arr) s+{-# inline forIx #-}+ set :: forall a. Array a -> a -> IO () set arr a = map' (\_ -> a) arr {-# inline set #-}
Data/Array/UM.hs view
@@ -83,6 +83,17 @@ in go arr 0# (sizeofMutableArrayArray# arr) s {-# inline for #-} +forIx :: forall a. Unlifted a => Array a -> (Int -> a -> IO ()) -> IO ()+forIx (Array arr) f = IO \s ->+ let go arr i n s = case i ==# n of+ 1# -> (# s, () #)+ _ -> case readUnlifted# arr i s of+ (# s, a #) -> case f (I# i)(from# a) of+ IO f -> case f s of+ (# s, _ #) -> go arr (i +# 1#) n s+ in go arr 0# (sizeofMutableArrayArray# arr) s+{-# inline forIx #-}+ set :: forall a. Unlifted a => Array a -> a -> IO () set arr a = map' (\_ -> a) arr {-# inline set #-}
primdata.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: primdata-version: 0.1.2.2+version: 0.1.2.3 synopsis: Minimum-overhead primitive datatypes category: primitive author: András Kovács