@@ -235,11 +235,8 @@ import Foreign.C.Types (CSize(..), CInt(..))
235import Foreign.Ptr (plusPtr, minusPtr, nullPtr)
235import Foreign.Ptr (plusPtr, minusPtr, nullPtr)
236import Streamly.Internal.Data.Unbox
236import Streamly.Internal.Data.Unbox
237 ( MutableByteArray(..)
237 ( MutableByteArray(..)
238− , Unbox
238+ , Unbox(..)
239 , getMutableByteArray#
239 , getMutableByteArray#
245import GHC.Base
242import GHC.Base
@@ -497,7 +494,7 @@ putIndexUnsafe :: forall m a. (MonadIO m, Unbox a)
497putIndexUnsafe i MutArray{..} x = do
494putIndexUnsafe i MutArray{..} x = do
498 let index = INDEX_OF(arrStart, i, a)
495 let index = INDEX_OF(arrStart, i, a)
499 assert (i >= 0 && INDEX_VALID(index, arrEnd, a)) (return ())
496 assert (i >= 0 && INDEX_VALID(index, arrEnd, a)) (return ())
500− liftIO $ pokeWith arrContents index x
497+ liftIO $ pokeByteIndex index arrContents x
502invalidIndex :: String -> Int -> a
499invalidIndex :: String -> Int -> a
503invalidIndex label i =
500invalidIndex label i =
@@ -515,7 +512,7 @@ putIndex :: forall m a. (MonadIO m, Unbox a) => Int -> MutArray a -> a -> m ()
515putIndex i MutArray{..} x = do
512putIndex i MutArray{..} x = do
516 let index = INDEX_OF(arrStart,i,a)
513 let index = INDEX_OF(arrStart,i,a)
517 if i >= 0 && INDEX_VALID(index,arrEnd,a)
514 if i >= 0 && INDEX_VALID(index,arrEnd,a)
518− then liftIO $ pokeWith arrContents index x
515+ then liftIO $ pokeByteIndex index arrContents x
519 else invalidIndex "putIndex" i
516 else invalidIndex "putIndex" i
521-- | Write an input stream of (index, value) pairs to an array. Throws an
518-- | Write an input stream of (index, value) pairs to an array. Throws an
@@ -541,9 +538,9 @@ modifyIndexUnsafe :: forall m a b. (MonadIO m, Unbox a) =>
541modifyIndexUnsafe i MutArray{..} f = liftIO $ do
538modifyIndexUnsafe i MutArray{..} f = liftIO $ do
542 let index = INDEX_OF(arrStart,i,a)
539 let index = INDEX_OF(arrStart,i,a)
543 assert (i >= 0 && INDEX_NEXT(index,a) <= arrEnd) (return ())
540 assert (i >= 0 && INDEX_NEXT(index,a) <= arrEnd) (return ())
544− r <- peekWith arrContents index
541+ r <- peekByteIndex index arrContents
545 let (x, res) = f r
542 let (x, res) = f r
546− pokeWith arrContents index x
543+ pokeByteIndex index arrContents x
547 return res
544 return res
549-- | Modify a given index of an array using a modifier function.
546-- | Modify a given index of an array using a modifier function.
@@ -555,9 +552,9 @@ modifyIndex i MutArray{..} f = do
555 let index = INDEX_OF(arrStart,i,a)
552 let index = INDEX_OF(arrStart,i,a)
556 if i >= 0 && INDEX_VALID(index,arrEnd,a)
553 if i >= 0 && INDEX_VALID(index,arrEnd,a)
557 then liftIO $ do
554 then liftIO $ do
558− r <- peekWith arrContents index
555+ r <- peekByteIndex index arrContents
559 let (x, res) = f r
556 let (x, res) = f r
560− pokeWith arrContents index x
557+ pokeByteIndex index arrContents x
561 return res
558 return res
562 else invalidIndex "modifyIndex" i
559 else invalidIndex "modifyIndex" i
@@ -591,8 +588,8 @@ modify MutArray{..} f = liftIO $
593 when (INDEX_VALID(i,arrEnd,a)) $ do
590 when (INDEX_VALID(i,arrEnd,a)) $ do
594− r <- peekWith arrContents i
591+ r <- peekByteIndex i arrContents
595− pokeWith arrContents i (f r)
592+ pokeByteIndex i arrContents (f r)
596 go (INDEX_NEXT(i,a))
593 go (INDEX_NEXT(i,a))
598-- XXX We could specify the number of bytes to swap instead of Proxy. Need
595-- XXX We could specify the number of bytes to swap instead of Proxy. Need
@@ -606,10 +603,10 @@ swapArrayByteIndices ::
608swapArrayByteIndices _ arrContents i1 i2 = do
605swapArrayByteIndices _ arrContents i1 i2 = do
609− r1 <- peekWith arrContents i1
606+ r1 <- peekByteIndex i1 arrContents
610− r2 <- peekWith arrContents i2
607+ r2 <- peekByteIndex i2 arrContents
611− pokeWith arrContents i1 (r2 :: a)
608+ pokeByteIndex i1 arrContents (r2 :: a)
612− pokeWith arrContents i2 (r1 :: a)
609+ pokeByteIndex i2 arrContents (r1 :: a)
614-- | Swap the elements at two indices without validating the indices.
611-- | Swap the elements at two indices without validating the indices.
@@ -882,7 +879,7 @@ rightSize arr@MutArray{..} = do
882snocNewEnd :: (MonadIO m, Unbox a) => Int -> MutArray a -> a -> m (MutArray a)
879snocNewEnd :: (MonadIO m, Unbox a) => Int -> MutArray a -> a -> m (MutArray a)
883snocNewEnd newEnd arr@MutArray{..} x = liftIO $ do
880snocNewEnd newEnd arr@MutArray{..} x = liftIO $ do
884 assert (newEnd <= arrBound) (return ())
881 assert (newEnd <= arrBound) (return ())
885− pokeWith arrContents arrEnd x
882+ pokeByteIndex arrEnd arrContents x
886 return $ arr {arrEnd = newEnd}
883 return $ arr {arrEnd = newEnd}
888-- | Really really unsafe, appends the element into the first array, may
885-- | Really really unsafe, appends the element into the first array, may
@@ -996,7 +993,7 @@ getIndexUnsafe :: forall m a. (MonadIO m, Unbox a) => Int -> MutArray a -> m a
996getIndexUnsafe i MutArray{..} = do
993getIndexUnsafe i MutArray{..} = do
997 let index = INDEX_OF(arrStart,i,a)
994 let index = INDEX_OF(arrStart,i,a)
998 assert (i >= 0 && INDEX_VALID(index,arrEnd,a)) (return ())
995 assert (i >= 0 && INDEX_VALID(index,arrEnd,a)) (return ())
999− liftIO $ peekWith arrContents index
996+ liftIO $ peekByteIndex index arrContents
1001-- | /O(1)/ Lookup the element at the given index. Index starts from 0.
998-- | /O(1)/ Lookup the element at the given index. Index starts from 0.
@@ -1005,7 +1002,7 @@ getIndex :: forall m a. (MonadIO m, Unbox a) => Int -> MutArray a -> m (Maybe a)
1005getIndex i MutArray{..} = do
1002getIndex i MutArray{..} = do
1006 let index = INDEX_OF(arrStart,i,a)
1003 let index = INDEX_OF(arrStart,i,a)
1007 if i >= 0 && INDEX_VALID(index,arrEnd,a)
1004 if i >= 0 && INDEX_VALID(index,arrEnd,a)
1008− then liftIO $ Just <$> peekWith arrContents index
1005+ then liftIO $ Just <$> peekByteIndex index arrContents
1009 else return Nothing
1006 else return Nothing
1011-- | /O(1)/ Lookup the element at the given index from the end of the array.
1008-- | /O(1)/ Lookup the element at the given index from the end of the array.
@@ -1018,7 +1015,7 @@ getIndexRev :: forall m a. (MonadIO m, Unbox a) => Int -> MutArray a -> m a
1018getIndexRev i MutArray{..} = do
1015getIndexRev i MutArray{..} = do
1019 let index = RINDEX_OF(arrEnd,i,a)
1016 let index = RINDEX_OF(arrEnd,i,a)
1020 if i >= 0 && index >= arrStart
1017 if i >= 0 && index >= arrStart
1021− then liftIO $ peekWith arrContents index
1018+ then liftIO $ peekByteIndex index arrContents
1022 else invalidIndex "getIndexRev" i
1019 else invalidIndex "getIndexRev" i
1024data GetIndicesState contents start end st =
1021data GetIndicesState contents start end st =
@@ -1158,7 +1155,7 @@ partitionBy f arr@MutArray{..} = liftIO $ do
1159 -- Invariant low < high on entry, and on return as well
1156 -- Invariant low < high on entry, and on return as well
1160 moveHigh low high = do
1157 moveHigh low high = do
1161− h <- peekWith arrContents high
1158+ h <- peekByteIndex high arrContents
1164 -- Correctly classified, continue the loop
1161 -- Correctly classified, continue the loop
@@ -1178,7 +1175,7 @@ partitionBy f arr@MutArray{..} = liftIO $ do
1178 -- low <= high
1175 -- low <= high
1179 -- Both low and high are valid locations within the array
1176 -- Both low and high are valid locations within the array
1180 go low high = do
1177 go low high = do
1181− l <- peekWith arrContents low
1178+ l <- peekByteIndex low arrContents
1184 -- low is wrongly classified
1181 -- low is wrongly classified
@@ -1189,8 +1186,8 @@ partitionBy f arr@MutArray{..} = liftIO $ do
1189 case r of
1186 case r of
1190 Nothing -> return low
1187 Nothing -> return low
1191 Just (high1, h) -> do -- low < high1
1188 Just (high1, h) -> do -- low < high1
1192− pokeWith arrContents low h
1189+ pokeByteIndex low arrContents h
1193− pokeWith arrContents high1 l
1190+ pokeByteIndex high1 arrContents l
1194 let low1 = INDEX_NEXT(low,a)
1191 let low1 = INDEX_NEXT(low,a)
1195 high2 = INDEX_PREV(high1,a)
1192 high2 = INDEX_PREV(high1,a)
1196 if low1 <= high2
1193 if low1 <= high2
@@ -1334,7 +1331,7 @@ chunksOf n (D.Stream step state) =
1334 r <- step (adaptState gst) st
1331 r <- step (adaptState gst) st
1335 case r of
1332 case r of
1336 D.Yield x s -> do
1333 D.Yield x s -> do
1337− liftIO $ pokeWith contents end x
1334+ liftIO $ pokeByteIndex end contents x
1338 let end1 = INDEX_NEXT(end,a)
1335 let end1 = INDEX_NEXT(end,a)
1339 return $
1336 return $
1340 if end1 >= bound
1337 if end1 >= bound
@@ -1396,7 +1393,7 @@ flattenArrays (D.Stream step state) = D.Stream step' (OuterLoop state)
1396 return $ D.Skip $ OuterLoop st
1393 return $ D.Skip $ OuterLoop st
1398 step' _ (InnerLoop st contents p end) = do
1395 step' _ (InnerLoop st contents p end) = do
1399− x <- liftIO $ peekWith contents p
1396+ x <- liftIO $ peekByteIndex p contents
1400 return $ D.Yield x (InnerLoop st contents (INDEX_NEXT(p,a)) end)
1397 return $ D.Yield x (InnerLoop st contents (INDEX_NEXT(p,a)) end)
1402-- | Use the "readerRev" unfold instead.
1399-- | Use the "readerRev" unfold instead.
@@ -1426,7 +1423,7 @@ flattenArraysRev (D.Stream step state) = D.Stream step' (OuterLoop state)
1426 return $ D.Skip $ OuterLoop st
1423 return $ D.Skip $ OuterLoop st
1428 step' _ (InnerLoop st contents p start) = do
1425 step' _ (InnerLoop st contents p start) = do
1429− x <- liftIO $ peekWith contents p
1426+ x <- liftIO $ peekByteIndex p contents
1430 let cur = INDEX_PREV(p,a)
1427 let cur = INDEX_PREV(p,a)
1431 return $ D.Yield x (InnerLoop st contents cur start)
1428 return $ D.Yield x (InnerLoop st contents cur start)
@@ -1465,7 +1462,7 @@ producerWith liftio = Producer step (return . toArrayUnsafe) extract
1465 -- few actions for correctness and execution order sanity. We want
1462 -- few actions for correctness and execution order sanity. We want
1466 -- the peek to occur right here and not lazily at some later point
1463 -- the peek to occur right here and not lazily at some later point
1467 -- because we want the peek to be ordered with respect to the touch.
1464 -- because we want the peek to be ordered with respect to the touch.
1468− !x <- liftio $ peekWith contents cur
1465+ !x <- liftio $ peekByteIndex cur contents
1469 return $ D.Yield x (ArrayUnsafe contents (INDEX_NEXT(cur,a)) end)
1466 return $ D.Yield x (ArrayUnsafe contents (INDEX_NEXT(cur,a)) end)
1471 extract = return . fromArrayUnsafe
1468 extract = return . fromArrayUnsafe
@@ -1496,7 +1493,7 @@ readerRevWith liftio = Unfold step inject
1496 {-# INLINE_LATE step #-}
1493 {-# INLINE_LATE step #-}
1497 step (ArrayUnsafe _ start p) | p < start = return D.Stop
1494 step (ArrayUnsafe _ start p) | p < start = return D.Stop
1498 step (ArrayUnsafe contents start p) = do
1495 step (ArrayUnsafe contents start p) = do
1499− !x <- liftio $ peekWith contents p
1496+ !x <- liftio $ peekByteIndex p contents
1500 return $ D.Yield x (ArrayUnsafe contents start (INDEX_PREV(p,a)))
1497 return $ D.Yield x (ArrayUnsafe contents start (INDEX_PREV(p,a)))
1502-- | Unfold an array into a stream in reverse order.
1499-- | Unfold an array into a stream in reverse order.
@@ -1527,7 +1524,7 @@ toListFB c n MutArray{..} = go arrStart
1527 -- evaluated/written to before we peek at them.
1524 -- evaluated/written to before we peek at them.
1529 let !x = unsafeInlineIO $ do
1526 let !x = unsafeInlineIO $ do
1530− r <- peekWith arrContents p
1527+ r <- peekByteIndex arrContents p
1531 return r
1528 return r
1532 in c x (go (PTR_NEXT(p,a)))
1529 in c x (go (PTR_NEXT(p,a)))
@@ -1544,7 +1541,7 @@ toList MutArray{..} = liftIO $ go arrStart
1545 go p | assert (p <= arrEnd) (p == arrEnd) = return []
1542 go p | assert (p <= arrEnd) (p == arrEnd) = return []
1546 go p = do
1543 go p = do
1547− x <- peekWith arrContents p
1544+ x <- peekByteIndex p arrContents
1548 (:) x <$> go (INDEX_NEXT(p,a))
1545 (:) x <$> go (INDEX_NEXT(p,a))
1550{-# INLINE_NORMAL toStreamDWith #-}
1547{-# INLINE_NORMAL toStreamDWith #-}
@@ -1558,7 +1555,7 @@ toStreamDWith liftio MutArray{..} = D.Stream step arrStart
1558 {-# INLINE_LATE step #-}
1555 {-# INLINE_LATE step #-}
1559 step _ p | assert (p <= arrEnd) (p == arrEnd) = return D.Stop
1556 step _ p | assert (p <= arrEnd) (p == arrEnd) = return D.Stop
1560 step _ p = liftio $ do
1557 step _ p = liftio $ do
1561− r <- peekWith arrContents p
1558+ r <- peekByteIndex p arrContents
1562 return $ D.Yield r (INDEX_NEXT(p,a))
1559 return $ D.Yield r (INDEX_NEXT(p,a))
1564-- | Convert a 'MutArray' into a stream.
1561-- | Convert a 'MutArray' into a stream.
@@ -1579,7 +1576,7 @@ toStreamKWith liftio MutArray{..} = go arrStart
1580 go p | assert (p <= arrEnd) (p == arrEnd) = K.nil
1577 go p | assert (p <= arrEnd) (p == arrEnd) = K.nil
1581 | otherwise =
1578 | otherwise =
1582− let elemM = peekWith arrContents p
1579+ let elemM = peekByteIndex p arrContents
1583 in liftio elemM `K.consM` go (INDEX_NEXT(p,a))
1580 in liftio elemM `K.consM` go (INDEX_NEXT(p,a))
1585{-# INLINE toStreamK #-}
1582{-# INLINE toStreamK #-}
@@ -1599,7 +1596,7 @@ toStreamDRevWith liftio MutArray{..} =
1599 {-# INLINE_LATE step #-}
1596 {-# INLINE_LATE step #-}
1600 step _ p | p < arrStart = return D.Stop
1597 step _ p | p < arrStart = return D.Stop
1601 step _ p = liftio $ do
1598 step _ p = liftio $ do
1602− r <- peekWith arrContents p
1599+ r <- peekByteIndex p arrContents
1603 return $ D.Yield r (INDEX_PREV(p,a))
1600 return $ D.Yield r (INDEX_PREV(p,a))
1605-- | Convert a 'MutArray' into a stream in reverse order.
1602-- | Convert a 'MutArray' into a stream in reverse order.
@@ -1622,7 +1619,7 @@ toStreamKRevWith liftio MutArray {..} =
1623 go p | p < arrStart = K.nil
1620 go p | p < arrStart = K.nil
1624 | otherwise =
1621 | otherwise =
1625− let elemM = peekWith arrContents p
1622+ let elemM = peekByteIndex p arrContents
1626 in liftio elemM `K.consM` go (INDEX_PREV(p,a))
1623 in liftio elemM `K.consM` go (INDEX_PREV(p,a))
1628{-# INLINE toStreamKRev #-}
1625{-# INLINE toStreamKRev #-}
@@ -1690,7 +1687,7 @@ writeAppendNUnsafe n action =
1690 return $ toArrayUnsafe arr1
1687 return $ toArrayUnsafe arr1
1692 step (ArrayUnsafe contents start end) x = do
1689 step (ArrayUnsafe contents start end) x = do
1693− liftIO $ pokeWith contents end x
1690+ liftIO $ pokeByteIndex end contents x
1694 return $ ArrayUnsafe contents start (INDEX_NEXT(end,a))
1691 return $ ArrayUnsafe contents start (INDEX_NEXT(end,a))
1696-- | Append @n@ elements to an existing array. Any free space left in the array
1693-- | Append @n@ elements to an existing array. Any free space left in the array
@@ -1750,7 +1747,7 @@ writeNWithUnsafe alloc n = fromArrayUnsafe <$> FL.foldlM' step initial
1750 initial = toArrayUnsafe <$> alloc (max n 0)
1747 initial = toArrayUnsafe <$> alloc (max n 0)
1752 step (ArrayUnsafe contents start end) x = do
1749 step (ArrayUnsafe contents start end) x = do
1753− liftIO $ pokeWith contents end x
1750+ liftIO $ pokeByteIndex end contents x
1755 $ ArrayUnsafe contents start (INDEX_NEXT(end,a))
1752 $ ArrayUnsafe contents start (INDEX_NEXT(end,a))
@@ -1806,7 +1803,7 @@ writeRevNWithUnsafe alloc n = fromArrayUnsafe <$> FL.foldlM' step initial
1807 step (ArrayUnsafe contents start end) x = do
1804 step (ArrayUnsafe contents start end) x = do
1808 let ptr = INDEX_PREV(start,a)
1805 let ptr = INDEX_PREV(start,a)
1809− liftIO $ pokeWith contents ptr x
1806+ liftIO $ pokeByteIndex ptr contents x
1811 $ ArrayUnsafe contents ptr end
1808 $ ArrayUnsafe contents ptr end
@@ -1938,7 +1935,7 @@ fromStreamDN limit str = do
1940 fwrite arrContents ptr x = do
1937 fwrite arrContents ptr x = do
1941− liftIO $ pokeWith arrContents ptr x
1938+ liftIO $ pokeByteIndex ptr arrContents x
1942 return $ INDEX_NEXT(ptr,a)
1939 return $ INDEX_NEXT(ptr,a)
1944-- | Create a 'MutArray' from the first N elements of a list. The array is
1941-- | Create a 'MutArray' from the first N elements of a list. The array is
@@ -2328,7 +2325,7 @@ strip eq arr@MutArray{..} = liftIO $ do
2328 getStart cur = do
2325 getStart cur = do
2329 if cur < arrEnd
2326 if cur < arrEnd
2331− r <- peekWith arrContents cur
2328+ r <- peekByteIndex cur arrContents
2333 then getStart (INDEX_NEXT(cur,a))
2330 then getStart (INDEX_NEXT(cur,a))
2334 else return cur
2331 else return cur
@@ -2338,7 +2335,7 @@ strip eq arr@MutArray{..} = liftIO $ do
2338 if cur > low
2335 if cur > low
2340 let prev = INDEX_PREV(cur,a)
2337 let prev = INDEX_PREV(cur,a)
2341− r <- peekWith arrContents prev
2338+ r <- peekByteIndex prev arrContents
2343 then getLast prev low
2340 then getLast prev low
2344 else return cur
2341 else return cur