@@ -200,6 +200,7 @@ module Streamly.Internal.Data.Array.Foreign.Mut.Type
202 , c_memchr
202 , c_memchr
@@ -275,6 +276,14 @@ import Prelude hiding
275-- >>> import qualified Streamly.Internal.Data.Fold as Fold
276-- >>> import qualified Streamly.Internal.Data.Fold as Fold
276-- >>> import qualified Streamly.Internal.Data.Fold.Type as Fold
277-- >>> import qualified Streamly.Internal.Data.Fold.Type as Fold
279+-------------------------------------------------------------------------------
281+-------------------------------------------------------------------------------
283+{-# INLINE sizeOfElem #-}
284+sizeOfElem :: forall a . (Storable a) => a -> Int
285+sizeOfElem _ = max 1 $ sizeOf (undefined :: a)
278-------------------------------------------------------------------------------
287-------------------------------------------------------------------------------
279-- Foreign helpers
288-- Foreign helpers
280-------------------------------------------------------------------------------
289-------------------------------------------------------------------------------
@@ -294,7 +303,7 @@ foreign import ccall unsafe "string.h memcmp" c_memcmp
294{-# INLINE bytesToElemCount #-}
303{-# INLINE bytesToElemCount #-}
295bytesToElemCount :: Storable a => a -> Int -> Int
304bytesToElemCount :: Storable a => a -> Int -> Int
296bytesToElemCount x n =
305bytesToElemCount x n =
297− let elemSize = sizeOf x
306+ let elemSize = sizeOfElem x
298 in n `div` elemSize
307 in n `div` elemSize
300-- XXX we are converting Int to CSize
309-- XXX we are converting Int to CSize
@@ -447,7 +456,7 @@ fromForeignPtrUnsafe fp@(ForeignPtr start contents) end bound =
447newArrayWith :: forall m a. (MonadIO m, Storable a)
456newArrayWith :: forall m a. (MonadIO m, Storable a)
448 => (Int -> Int -> m (ArrayContents, Ptr a)) -> Int -> Int -> m (Array a)
457 => (Int -> Int -> m (ArrayContents, Ptr a)) -> Int -> Int -> m (Array a)
449newArrayWith alloc alignSize count = do
458newArrayWith alloc alignSize count = do
450− let size = max (count * sizeOf (undefined :: a)) 0
459+ let size = max (count * sizeOfElem (undefined :: a)) 0
451 (contents, p) <- alloc size alignSize
460 (contents, p) <- alloc size alignSize
452 return $ Array
461 return $ Array
453 { arrContents = contents
462 { arrContents = contents
@@ -502,7 +511,7 @@ newArrayAlignedUnmanaged = do
502 return (ArrayContents contents, Ptr addr)
511 return (ArrayContents contents, Ptr addr)
504newArrayAlignedUnmanaged _align count = do
513newArrayAlignedUnmanaged _align count = do
505− let size = max (count * sizeOf (undefined :: a)) 0
514+ let size = max (count * sizeOfElem (undefined :: a)) 0
506 p <- liftIO $ mallocBytes size
515 p <- liftIO $ mallocBytes size
507 return $ Array
516 return $ Array
508 { arrContents = nilArrayContents
517 { arrContents = nilArrayContents
@@ -556,7 +565,7 @@ putIndexUnsafe :: forall m a. (MonadIO m, Storable a)
556 => Array a -> Int -> a -> m ()
565 => Array a -> Int -> a -> m ()
557putIndexUnsafe Array{..} i x =
566putIndexUnsafe Array{..} i x =
558 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
567 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
559− let elemSize = sizeOf (undefined :: a)
568+ let elemSize = sizeOfElem (undefined :: a)
560 elemPtr = ptr `plusPtr` (elemSize * i)
569 elemPtr = ptr `plusPtr` (elemSize * i)
561 assert (i >= 0 && elemPtr `plusPtr` elemSize <= aEnd) (return ())
570 assert (i >= 0 && elemPtr `plusPtr` elemSize <= aEnd) (return ())
562 liftIO $ poke elemPtr x
571 liftIO $ poke elemPtr x
@@ -569,7 +578,7 @@ invalidIndex label i =
569putIndexPtr :: forall m a. (MonadIO m, Storable a) =>
578putIndexPtr :: forall m a. (MonadIO m, Storable a) =>
570 Ptr a -> Ptr a -> Int -> a -> m ()
579 Ptr a -> Ptr a -> Int -> a -> m ()
571putIndexPtr start end i x = do
580putIndexPtr start end i x = do
572− let elemSize = sizeOf (undefined :: a)
581+ let elemSize = sizeOfElem (undefined :: a)
573 elemPtr = start `plusPtr` (elemSize * i)
582 elemPtr = start `plusPtr` (elemSize * i)
574 if i >= 0 && elemPtr `plusPtr` elemSize <= end
583 if i >= 0 && elemPtr `plusPtr` elemSize <= end
575 then liftIO $ poke elemPtr x
584 then liftIO $ poke elemPtr x
@@ -613,7 +622,7 @@ modifyIndexUnsafe :: forall m a b. (MonadIO m, Storable a) =>
613 Array a -> Int -> (a -> (a, b)) -> m b
622 Array a -> Int -> (a -> (a, b)) -> m b
614modifyIndexUnsafe Array{..} i f = do
623modifyIndexUnsafe Array{..} i f = do
615 liftIO $ unsafeWithArrayContents arrContents arrStart $ \ptr -> do
624 liftIO $ unsafeWithArrayContents arrContents arrStart $ \ptr -> do
616− let elemSize = sizeOf (undefined :: a)
625+ let elemSize = sizeOfElem (undefined :: a)
617 elemPtr = ptr `plusPtr` (elemSize * i)
626 elemPtr = ptr `plusPtr` (elemSize * i)
618 assert (i >= 0 && elemPtr `plusPtr` elemSize <= aEnd) (return ())
627 assert (i >= 0 && elemPtr `plusPtr` elemSize <= aEnd) (return ())
619 r <- peek elemPtr
628 r <- peek elemPtr
@@ -769,7 +778,7 @@ roundUpToPower2 x =
769{-# INLINE allocBytesToBytes #-}
778{-# INLINE allocBytesToBytes #-}
770allocBytesToBytes :: forall a. Storable a => a -> Int -> Int
779allocBytesToBytes :: forall a. Storable a => a -> Int -> Int
771allocBytesToBytes _ n =
780allocBytesToBytes _ n =
772− max (arrayPayloadSize n) (sizeOf (undefined :: a))
781+ max (arrayPayloadSize n) (sizeOfElem (undefined :: a))
774-- | Given a 'Storable' type (unused first arg) and real allocation size
783-- | Given a 'Storable' type (unused first arg) and real allocation size
775-- (including overhead), return how many elements of that type will completely
784-- (including overhead), return how many elements of that type will completely
@@ -819,7 +828,7 @@ snocNewEnd newEnd arr@Array{..} x = liftIO $ do
819snocUnsafe :: forall m a. (MonadIO m, Storable a) =>
828snocUnsafe :: forall m a. (MonadIO m, Storable a) =>
820 Array a -> a -> m (Array a)
829 Array a -> a -> m (Array a)
821snocUnsafe arr@Array{..} =
830snocUnsafe arr@Array{..} =
822− snocNewEnd (aEnd `plusPtr` sizeOf (undefined :: a)) arr
831+ snocNewEnd (aEnd `plusPtr` sizeOfElem (undefined :: a)) arr
824-- | Like 'snoc' but does not reallocate when pre-allocated array capacity
833-- | Like 'snoc' but does not reallocate when pre-allocated array capacity
825-- becomes full.
834-- becomes full.
@@ -829,7 +838,7 @@ snocUnsafe arr@Array{..} =
829snocMay :: forall m a. (MonadIO m, Storable a) =>
838snocMay :: forall m a. (MonadIO m, Storable a) =>
830 Array a -> a -> m (Maybe (Array a))
839 Array a -> a -> m (Maybe (Array a))
831snocMay arr@Array{..} x = liftIO $ do
840snocMay arr@Array{..} x = liftIO $ do
832− let newEnd = aEnd `plusPtr` sizeOf (undefined :: a)
841+ let newEnd = aEnd `plusPtr` sizeOfElem (undefined :: a)
833 if newEnd <= aBound
842 if newEnd <= aBound
834 then Just <$> snocNewEnd newEnd arr x
843 then Just <$> snocNewEnd newEnd arr x
835 else return Nothing
844 else return Nothing
@@ -866,7 +875,7 @@ snocWithRealloc :: forall m a. (MonadIO m, Storable a) =>
867 -> m (Array a)
876 -> m (Array a)
868snocWithRealloc sizer arr x = do
877snocWithRealloc sizer arr x = do
869− let elemSize = sizeOf (undefined :: a)
878+ let elemSize = sizeOfElem (undefined :: a)
870 arr1 <- liftIO $ reallocWith "snocWith" sizer elemSize arr
879 arr1 <- liftIO $ reallocWith "snocWith" sizer elemSize arr
871 snocUnsafe arr1 x
880 snocUnsafe arr1 x
@@ -890,7 +899,7 @@ snocWith :: forall m a. (MonadIO m, Storable a) =>
891 -> m (Array a)
900 -> m (Array a)
892snocWith allocSize arr x = liftIO $ do
901snocWith allocSize arr x = liftIO $ do
893− let newEnd = aEnd arr `plusPtr` sizeOf (undefined :: a)
902+ let newEnd = aEnd arr `plusPtr` sizeOfElem (undefined :: a)
894 if newEnd <= aBound arr
903 if newEnd <= aBound arr
895 then snocNewEnd newEnd arr x
904 then snocNewEnd newEnd arr x
896 else snocWithRealloc allocSize arr x
905 else snocWithRealloc allocSize arr x
@@ -963,7 +972,7 @@ realloc :: forall m a. (MonadIO m, Storable a) => Int -> Array a -> m (Array a)
963realloc i arr =
972realloc i arr =
965 $ reallocAligned
974 $ reallocAligned
966− (sizeOf (undefined :: a)) (alignment (undefined :: a)) i arr
975+ (sizeOfElem (undefined :: a)) (alignment (undefined :: a)) i arr
968-- | Change the reserved memory of the array so that it is enough to hold the
977-- | Change the reserved memory of the array so that it is enough to hold the
969-- specified number of elements. Nothing is done if the specified capacity is
978-- specified number of elements. Nothing is done if the specified capacity is
@@ -1005,7 +1014,7 @@ rightSize arr@Array{..} = do
1005 target = roundUpLargeArray len
1014 target = roundUpLargeArray len
1006 waste = aBound `minusPtr` aEnd
1015 waste = aBound `minusPtr` aEnd
1007 assert (target >= len) (return ())
1016 assert (target >= len) (return ())
1008− assert (len `mod` sizeOf (undefined :: a) == 0) (return ())
1017+ assert (len `mod` sizeOfElem (undefined :: a) == 0) (return ())
1009 -- We trade off some wastage (25%) to avoid reallocations and copying.
1018 -- We trade off some wastage (25%) to avoid reallocations and copying.
1010 if target < capacity && len < 3 * waste
1019 if target < capacity && len < 3 * waste
1011 then realloc target arr
1020 then realloc target arr
@@ -1056,7 +1065,7 @@ truncateExp = undefined
1056getIndexUnsafe :: forall m a. (MonadIO m, Storable a) => Array a -> Int -> m a
1065getIndexUnsafe :: forall m a. (MonadIO m, Storable a) => Array a -> Int -> m a
1057getIndexUnsafe Array {..} i =
1066getIndexUnsafe Array {..} i =
1058 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
1067 unsafeWithArrayContents arrContents arrStart $ \ptr -> do
1059− let elemSize = sizeOf (undefined :: a)
1068+ let elemSize = sizeOfElem (undefined :: a)
1060 elemPtr = ptr `plusPtr` (elemSize * i)
1069 elemPtr = ptr `plusPtr` (elemSize * i)
1061 assert (i >= 0 && elemPtr `plusPtr` elemSize <= aEnd) (return ())
1070 assert (i >= 0 && elemPtr `plusPtr` elemSize <= aEnd) (return ())
1062 liftIO $ peek elemPtr
1071 liftIO $ peek elemPtr
@@ -1065,7 +1074,7 @@ getIndexUnsafe Array {..} i =
1065getIndexPtr :: forall m a. (MonadIO m, Storable a) =>
1074getIndexPtr :: forall m a. (MonadIO m, Storable a) =>
1066 Ptr a -> Ptr a -> Int -> m a
1075 Ptr a -> Ptr a -> Int -> m a
1067getIndexPtr ptr end i = do
1076getIndexPtr ptr end i = do
1068− let elemSize = sizeOf (undefined :: a)
1077+ let elemSize = sizeOfElem (undefined :: a)
1069 elemPtr = ptr `plusPtr` (elemSize * i)
1078 elemPtr = ptr `plusPtr` (elemSize * i)
1070 if i >= 0 && elemPtr `plusPtr` elemSize <= end
1079 if i >= 0 && elemPtr `plusPtr` elemSize <= end
1071 then liftIO $ peek elemPtr
1080 then liftIO $ peek elemPtr
@@ -1083,7 +1092,7 @@ getIndex arr i =
1083getIndexPtrRev :: forall m a. (MonadIO m, Storable a) =>
1092getIndexPtrRev :: forall m a. (MonadIO m, Storable a) =>
1084 Ptr a -> Ptr a -> Int -> m a
1093 Ptr a -> Ptr a -> Int -> m a
1085getIndexPtrRev ptr end i = do
1094getIndexPtrRev ptr end i = do
1086− let elemSize = sizeOf (undefined :: a)
1095+ let elemSize = sizeOfElem (undefined :: a)
1087 elemPtr = end `plusPtr` negate (elemSize * (i + 1))
1096 elemPtr = end `plusPtr` negate (elemSize * (i + 1))
1088 if i >= 0 && elemPtr >= ptr
1097 if i >= 0 && elemPtr >= ptr
1089 then liftIO $ peek elemPtr
1098 then liftIO $ peek elemPtr
@@ -1151,7 +1160,7 @@ getSliceUnsafe :: forall a. Storable a
1151 -> Array a
1160 -> Array a
1152 -> Array a
1161 -> Array a
1153getSliceUnsafe index len (Array contents start e _) =
1162getSliceUnsafe index len (Array contents start e _) =
1154− let size = sizeOf (undefined :: a)
1163+ let size = sizeOfElem (undefined :: a)
1155 fp1 = start `plusPtr` (index * size)
1164 fp1 = start `plusPtr` (index * size)
1156 end = fp1 `plusPtr` (len * size)
1165 end = fp1 `plusPtr` (len * size)
1157 in assert
1166 in assert
@@ -1169,7 +1178,7 @@ getSlice :: forall a. Storable a =>
1169 -> Array a
1178 -> Array a
1170 -> Array a
1179 -> Array a
1171getSlice index len (Array contents start e _) =
1180getSlice index len (Array contents start e _) =
1172− let size = sizeOf (undefined :: a)
1181+ let size = sizeOfElem (undefined :: a)
1173 fp1 = start `plusPtr` (index * size)
1182 fp1 = start `plusPtr` (index * size)
1174 end = fp1 `plusPtr` (len * size)
1183 end = fp1 `plusPtr` (len * size)
1175 in if index >= 0 && len >= 0 && end <= e
1184 in if index >= 0 && len >= 0 && end <= e
@@ -1288,7 +1297,7 @@ byteLength Array{..} =
1288{-# INLINE length #-}
1297{-# INLINE length #-}
1289length :: forall a. Storable a => Array a -> Int
1298length :: forall a. Storable a => Array a -> Int
1290length arr =
1299length arr =
1291− let elemSize = sizeOf (undefined :: a)
1300+ let elemSize = sizeOfElem (undefined :: a)
1292 blen = byteLength arr
1301 blen = byteLength arr
1293 in assert (blen `mod` elemSize == 0) (blen `div` elemSize)
1302 in assert (blen `mod` elemSize == 0) (blen `div` elemSize)
@@ -1356,7 +1365,7 @@ arraysOf n (D.Stream step state) =
1356 case r of
1365 case r of
1357 D.Yield x s -> do
1366 D.Yield x s -> do
1358 liftIO $ poke end x >> touch contents
1367 liftIO $ poke end x >> touch contents
1359− let end' = end `plusPtr` sizeOf (undefined :: a)
1368+ let end' = end `plusPtr` sizeOfElem (undefined :: a)
1360 return $
1369 return $
1361 if end' >= bound
1370 if end' >= bound
1362 then D.Skip
1371 then D.Skip
@@ -1422,7 +1431,7 @@ flattenArrays (D.Stream step state) = D.Stream step' (OuterLoop state)
1422 touch contents
1431 touch contents
1423 return r
1432 return r
1424 return $ D.Yield x (InnerLoop st contents
1433 return $ D.Yield x (InnerLoop st contents
1425− (p `plusPtr` sizeOf (undefined :: a)) end)
1434+ (p `plusPtr` sizeOfElem (undefined :: a)) end)
1427-- | Use the "readRev" unfold instead.
1436-- | Use the "readRev" unfold instead.
@@ -1442,7 +1451,7 @@ flattenArraysRev (D.Stream step state) = D.Stream step' (OuterLoop state)
1442 r <- step (adaptState gst) st
1451 r <- step (adaptState gst) st
1443 return $ case r of
1452 return $ case r of
1444 D.Yield Array{..} s ->
1453 D.Yield Array{..} s ->
1445− let p = aEnd `plusPtr` negate (sizeOf (undefined :: a))
1454+ let p = aEnd `plusPtr` negate (sizeOfElem (undefined :: a))
1446 in D.Skip (InnerLoop s arrContents p arrStart)
1455 in D.Skip (InnerLoop s arrContents p arrStart)
1447 D.Skip s -> D.Skip (OuterLoop s)
1456 D.Skip s -> D.Skip (OuterLoop s)
1448 D.Stop -> D.Stop
1457 D.Stop -> D.Stop
@@ -1455,7 +1464,7 @@ flattenArraysRev (D.Stream step state) = D.Stream step' (OuterLoop state)
1455 r <- peek p
1464 r <- peek p
1456 touch contents
1465 touch contents
1457 return r
1466 return r
1458− let cur = p `plusPtr` negate (sizeOf (undefined :: a))
1467+ let cur = p `plusPtr` negate (sizeOfElem (undefined :: a))
1459 return $ D.Yield x (InnerLoop st contents cur start)
1468 return $ D.Yield x (InnerLoop st contents cur start)
1461-------------------------------------------------------------------------------
1470-------------------------------------------------------------------------------
@@ -1484,7 +1493,7 @@ producer = Producer step (return . toReadUState) extract
1484 return D.Stop
1493 return D.Stop
1485 step (ReadUState contents end cur) = do
1494 step (ReadUState contents end cur) = do
1486 !x <- liftIO $ peek cur
1495 !x <- liftIO $ peek cur
1487− let cur1 = cur `plusPtr` sizeOf (undefined :: a)
1496+ let cur1 = cur `plusPtr` sizeOfElem (undefined :: a)
1488 return $ D.Yield x (ReadUState contents end cur1)
1497 return $ D.Yield x (ReadUState contents end cur1)
1490 extract (ReadUState contents end cur) = return $ Array contents cur end end
1499 extract (ReadUState contents end cur) = return $ Array contents cur end end
@@ -1505,7 +1514,7 @@ readRev = Unfold step inject
1507 inject (Array contents start end _) =
1516 inject (Array contents start end _) =
1508− let p = end `plusPtr` negate (sizeOf (undefined :: a))
1517+ let p = end `plusPtr` negate (sizeOfElem (undefined :: a))
1509 in return $ ReadUState contents start p
1518 in return $ ReadUState contents start p
1511 {-# INLINE_LATE step #-}
1520 {-# INLINE_LATE step #-}
@@ -1514,7 +1523,7 @@ readRev = Unfold step inject
1514 return D.Stop
1523 return D.Stop
1515 step (ReadUState contents start p) = do
1524 step (ReadUState contents start p) = do
1516 x <- liftIO $ peek p
1525 x <- liftIO $ peek p
1517− let cur = p `plusPtr` negate (sizeOf (undefined :: a))
1526+ let cur = p `plusPtr` negate (sizeOfElem (undefined :: a))
1518 return $ D.Yield x (ReadUState contents start cur)
1527 return $ D.Yield x (ReadUState contents start cur)
1520-------------------------------------------------------------------------------
1529-------------------------------------------------------------------------------
@@ -1542,7 +1551,7 @@ toListFB c n Array{..} = go arrStart
1542 r <- peek p
1551 r <- peek p
1543 touch arrContents
1552 touch arrContents
1544 return r
1553 return r
1545− in c x (go (p `plusPtr` sizeOf (undefined :: a)))
1554+ in c x (go (p `plusPtr` sizeOfElem (undefined :: a)))
1548-- XXX Monadic foldr/build fusion?
1557-- XXX Monadic foldr/build fusion?
@@ -1559,7 +1568,7 @@ toList Array{..} = liftIO $ go arrStart
1559 go p = do
1568 go p = do
1560 x <- peek p
1569 x <- peek p
1561 touch arrContents
1570 touch arrContents
1562− (:) x <$> go (p `plusPtr` sizeOf (undefined :: a))
1571+ (:) x <$> go (p `plusPtr` sizeOfElem (undefined :: a))
1564-- | Use the 'read' unfold instead.
1573-- | Use the 'read' unfold instead.
@@ -1577,7 +1586,7 @@ toStreamD Array{..} = D.Stream step arrStart
1577 step _ p = liftIO $ do
1586 step _ p = liftIO $ do
1578 r <- peek p
1587 r <- peek p
1579 touch arrContents
1588 touch arrContents
1580− return $ D.Yield r (p `plusPtr` sizeOf (undefined :: a))
1589+ return $ D.Yield r (p `plusPtr` sizeOfElem (undefined :: a))
1582{-# INLINE toStreamK #-}
1591{-# INLINE toStreamK #-}
1583toStreamK :: forall m a. (MonadIO m, Storable a) => Array a -> K.Stream m a
1592toStreamK :: forall m a. (MonadIO m, Storable a) => Array a -> K.Stream m a
@@ -1591,7 +1600,7 @@ toStreamK Array{..} = go arrStart
1591 r <- peek p
1600 r <- peek p
1592 touch arrContents
1601 touch arrContents
1593 return r
1602 return r
1594− in liftIO elemM `K.consM` go (p `plusPtr` sizeOf (undefined :: a))
1603+ in liftIO elemM `K.consM` go (p `plusPtr` sizeOfElem (undefined :: a))
1596-- | Use the 'readRev' unfold instead.
1605-- | Use the 'readRev' unfold instead.
@@ -1601,7 +1610,7 @@ toStreamK Array{..} = go arrStart
1601{-# INLINE_NORMAL toStreamDRev #-}
1610{-# INLINE_NORMAL toStreamDRev #-}
1602toStreamDRev :: forall m a. (MonadIO m, Storable a) => Array a -> D.Stream m a
1611toStreamDRev :: forall m a. (MonadIO m, Storable a) => Array a -> D.Stream m a
1603toStreamDRev Array{..} =
1612toStreamDRev Array{..} =
1604− let p = aEnd `plusPtr` negate (sizeOf (undefined :: a))
1613+ let p = aEnd `plusPtr` negate (sizeOfElem (undefined :: a))
1605 in D.Stream step p
1614 in D.Stream step p
@@ -1611,12 +1620,12 @@ toStreamDRev Array{..} =
1611 step _ p = liftIO $ do
1620 step _ p = liftIO $ do
1612 r <- peek p
1621 r <- peek p
1613 touch arrContents
1622 touch arrContents
1614− return $ D.Yield r (p `plusPtr` negate (sizeOf (undefined :: a)))
1623+ return $ D.Yield r (p `plusPtr` negate (sizeOfElem (undefined :: a)))
1616{-# INLINE toStreamKRev #-}
1625{-# INLINE toStreamKRev #-}
1617toStreamKRev :: forall m a. (MonadIO m, Storable a) => Array a -> K.Stream m a
1626toStreamKRev :: forall m a. (MonadIO m, Storable a) => Array a -> K.Stream m a
1618toStreamKRev Array {..} =
1627toStreamKRev Array {..} =
1619− let p = aEnd `plusPtr` negate (sizeOf (undefined :: a))
1628+ let p = aEnd `plusPtr` negate (sizeOfElem (undefined :: a))
@@ -1627,7 +1636,7 @@ toStreamKRev Array {..} =
1627 r <- peek p
1636 r <- peek p
1628 touch arrContents
1637 touch arrContents
1629 return r
1638 return r
1630− in liftIO elemM `K.consM` go (p `plusPtr` negate (sizeOf (undefined :: a)))
1639+ in liftIO elemM `K.consM` go (p `plusPtr` negate (sizeOfElem (undefined :: a)))
1632-------------------------------------------------------------------------------
1641-------------------------------------------------------------------------------
1633-- Folding
1642-- Folding
@@ -1696,7 +1705,7 @@ appendNUnsafe action n =
1696 assert (n >= 0) (return ())
1705 assert (n >= 0) (return ())
1697 arr@(Array _ _ end bound) <- action
1706 arr@(Array _ _ end bound) <- action
1698 let free = bound `minusPtr` end
1707 let free = bound `minusPtr` end
1699− elemSize = sizeOf (undefined :: a)
1708+ elemSize = sizeOfElem (undefined :: a)
1700 needed = n * elemSize
1709 needed = n * elemSize
1701 -- XXX We can also reallocate if the array has too much free space,
1710 -- XXX We can also reallocate if the array has too much free space,
1702 -- otherwise we lose that space.
1711 -- otherwise we lose that space.
@@ -1708,7 +1717,7 @@ appendNUnsafe action n =
1709 step (ArrayUnsafe contents start end) x = do
1718 step (ArrayUnsafe contents start end) x = do
1710 liftIO $ poke end x >> touch contents
1719 liftIO $ poke end x >> touch contents
1711− let end1 = end `plusPtr` sizeOf (undefined :: a)
1720+ let end1 = end `plusPtr` sizeOfElem (undefined :: a)
1712 return $ ArrayUnsafe contents start end1
1721 return $ ArrayUnsafe contents start end1
1714-- | Append @n@ elements to an existing array. Any free space left in the array
1723-- | Append @n@ elements to an existing array. Any free space left in the array
@@ -1826,7 +1835,7 @@ writeNWithUnsafe alloc n = Fold step initial (return . fromArrayUnsafe)
1826 liftIO $ poke end x >> touch contents
1835 liftIO $ poke end x >> touch contents
1828 $ FL.Partial
1837 $ FL.Partial
1829− $ ArrayUnsafe contents start (end `plusPtr` sizeOf (undefined :: a))
1838+ $ ArrayUnsafe contents start (end `plusPtr` sizeOfElem (undefined :: a))
1831-- | Like 'writeN' but does not check the array bounds when writing. The fold
1840-- | Like 'writeN' but does not check the array bounds when writing. The fold
1832-- driver must not call the step function more than 'n' times otherwise it will
1841-- driver must not call the step function more than 'n' times otherwise it will
@@ -1899,20 +1908,20 @@ writeWith elemCount =
1900 insertElem (Array contents start end bound) x = do
1909 insertElem (Array contents start end bound) x = do
1901 liftIO $ poke end x
1910 liftIO $ poke end x
1902− let end1 = end `plusPtr` sizeOf (undefined :: a)
1911+ let end1 = end `plusPtr` sizeOfElem (undefined :: a)
1903 return $ Array contents start end1 bound
1912 return $ Array contents start end1 bound
1905 initial = do
1914 initial = do
1906 when (elemCount < 0) $ error "writeWith: elemCount is negative"
1915 when (elemCount < 0) $ error "writeWith: elemCount is negative"
1907 liftIO $ newArrayAligned (alignment (undefined :: a)) elemCount
1916 liftIO $ newArrayAligned (alignment (undefined :: a)) elemCount
1908 step arr@(Array _ start end bound) x
1917 step arr@(Array _ start end bound) x
1909− | end `plusPtr` sizeOf (undefined :: a) > bound = do
1918+ | end `plusPtr` sizeOfElem (undefined :: a) > bound = do
1910 let oldSize = end `minusPtr` start
1919 let oldSize = end `minusPtr` start
1911 newSize = max (oldSize * 2) 1
1920 newSize = max (oldSize * 2) 1
1914 $ reallocAligned
1923 $ reallocAligned
1915− (sizeOf (undefined :: a))
1924+ (sizeOfElem (undefined :: a))
1916 (alignment (undefined :: a))
1925 (alignment (undefined :: a))
@@ -1953,7 +1962,7 @@ fromStreamDN limit str = do
1954 fwrite ptr x = do
1963 fwrite ptr x = do
1955 liftIO $ poke ptr x
1964 liftIO $ poke ptr x
1956− return $ ptr `plusPtr` sizeOf (undefined :: a)
1965+ return $ ptr `plusPtr` sizeOfElem (undefined :: a)
1958-- | Create an 'Array' from the first N elements of a list. The array is
1967-- | Create an 'Array' from the first N elements of a list. The array is
1959-- allocated to size N, if the list terminates before N elements then the
1968-- allocated to size N, if the list terminates before N elements then the
@@ -2147,7 +2156,7 @@ splitAt i arr@Array{..} =
2147 else if i > maxIndex
2156 else if i > maxIndex
2148 then error $ "sliceAt: specified array index " ++ show i
2157 then error $ "sliceAt: specified array index " ++ show i
2149 ++ " is beyond the maximum index " ++ show maxIndex
2158 ++ " is beyond the maximum index " ++ show maxIndex
2150− else let off = i * sizeOf (undefined :: a)
2159+ else let off = i * sizeOfElem (undefined :: a)
2151 p = arrStart `plusPtr` off
2160 p = arrStart `plusPtr` off
2152 in ( Array
2161 in ( Array
2153 { arrContents = arrContents
2162 { arrContents = arrContents
@@ -2198,7 +2207,7 @@ asBytes = castUnsafe
2198cast :: forall a b. Storable b => Array a -> Maybe (Array b)
2207cast :: forall a b. Storable b => Array a -> Maybe (Array b)
2199cast arr =
2208cast arr =
2200 let len = byteLength arr
2209 let len = byteLength arr
2201− r = len `mod` sizeOf (undefined :: b)
2210+ r = len `mod` sizeOfElem (undefined :: b)
2202 in if r /= 0
2211 in if r /= 0
2203 then Nothing
2212 then Nothing
2204 else Just $ castUnsafe arr
2213 else Just $ castUnsafe arr