on master help sign in
Add todos for monadic mutable APIs
commit0a8689c58744a0f00fbaaddde2d85db521ae44fe authorHarendra Kumar <harendra@composewell.com> dateSun 10 Oct 2021, 19:10 (5 years ago) parente870b5c
1 file changed+13
src/Streamly/Internal/Data/Array/Foreign/Mut/Type.hs+13
src/Streamly/Internal/Data/Array/Foreign/Mut/Type.hs+13
@@ -701,12 +701,14 @@ toListFB c n Array{..} = go (unsafeForeignPtrToPtr aStart)
701701 --
702702 -- This should be safe as the array contents are guaranteed to be
703703 -- evaluated/written to before we peek at them.
704+ -- XXX
704705 let !x = unsafeInlineIO $ do
705706 r <- peek p
706707 touchForeignPtr aStart
707708 return r
708709 in c x (go (p `plusPtr` sizeOf (undefined :: a)))
709710
711+-- XXX Should be monadic
710712-- | Convert an 'Array' into a list.
711713--
712714-- @since 0.7.0
@@ -736,6 +738,9 @@ toStreamD Array{..} =
736738 --
737739 -- This should be safe as the array contents are guaranteed to be
738740 -- evaluated/written to before we peek at them.
741+ --
742+ -- XXX This may not be safe for mutable arrays.
743+ --
739744 let !x = unsafeInlineIO $ do
740745 r <- peek p
741746 touchForeignPtr aStart
@@ -753,6 +758,7 @@ toStreamK Array{..} =
753758 go p | assert (p <= aEnd) (p == aEnd) = K.nil
754759 | otherwise =
755760 -- See Note in toStreamD.
761+ -- XXX May not be safe for mutable arrays.
756762 let !x = unsafeInlineIO $ do
757763 r <- peek p
758764 touchForeignPtr aStart
@@ -776,6 +782,7 @@ toStreamDRev Array{..} =
776782 step _ p | p < unsafeForeignPtrToPtr aStart = return D.Stop
777783 step _ p = do
778784 -- See comments in toStreamD for why we use unsafeInlineIO
785+ -- XXX
779786 let !x = unsafeInlineIO $ do
780787 r <- peek p
781788 touchForeignPtr aStart
@@ -792,6 +799,7 @@ toStreamKRev Array {..} =
792799
793800 go p | p < unsafeForeignPtrToPtr aStart = K.nil
794801 | otherwise =
802+ -- XXX
795803 let !x = unsafeInlineIO $ do
796804 r <- peek p
797805 touchForeignPtr aStart
@@ -802,13 +810,18 @@ toStreamKRev Array {..} =
802810-- Folding
803811-------------------------------------------------------------------------------
804812
813+-- XXX Need something like "Array m a" enforcing monadic action to avoid the
814+-- possibility of such APIs.
815+--
805816-- | Strict left fold of an array.
806817{-# INLINE_NORMAL foldl' #-}
807818foldl' :: forall a b. Storable a => (b -> a -> b) -> b -> Array a -> b
819+-- XXX Should be monadic
808820foldl' f z arr = runIdentity $ D.foldl' f z $ toStreamD arr
809821
810822-- | Right fold of an array.
811823{-# INLINE_NORMAL foldr #-}
824+-- XXX Should be monadic
812825foldr :: Storable a => (a -> b -> b) -> b -> Array a -> b
813826foldr f z arr = runIdentity $ D.foldr f z $ toStreamD arr
814827