@@ -53,6 +53,7 @@ module Streamly.Internal.Data.Array.Foreign.Mut.Type
5353 -- * Folding
5454 , foldl'
5555 , foldr
56+ , cmp
5657
5758 -- * Composable Folds
5859 , toArrayMinChunk
@@ -1105,7 +1106,7 @@ spliceWithDoubling dst@(Array start end bound) src = do
11051106 newSize = max (oldSize * 2) (oldSize + srcLen)
11061107 when (newSize < oldSize + srcLen)
11071108 $ error
1108− $ "spliceWithDoubling: newSize is less than the total size "
1109+ $ "spliceWith: newSize is less than the total size "
11091110 ++ "of arrays being appended. Please check the "
11101111 ++ "newSize function passed."
11111112 liftIO $ realloc newSize dst
@@ -1216,37 +1217,31 @@ asPtrUnsafe Array{..} act = do
12161217 unsafeWithForeignPtr aStart $ \ptr -> act (castPtr ptr)
12171218
12181219-------------------------------------------------------------------------------
1219−-- Instances
1220+-- Equality
12201221-------------------------------------------------------------------------------
12211222
1222−instance (Show a, Storable a) => Show (Array a) where
1223− {-# INLINE showsPrec #-}
1224− showsPrec _ = shows . toList
1225−
1226−{-# INLINE arrcmp #-}
1227−arrcmp :: Array a -> Array a -> Bool
1228−arrcmp arr1 arr2 =
1229− let !res = unsafeInlineIO $ do
1230− let ptr1 = unsafeForeignPtrToPtr $ aStart arr1
1231− let ptr2 = unsafeForeignPtrToPtr $ aStart arr2
1232− let len1 = aEnd arr1 `minusPtr` ptr1
1233− let len2 = aEnd arr2 `minusPtr` ptr2
1234−
1235− if len1 == len2
1236− then do
1223+-- | Compare if two arrays are equal.
1224+--
1225+-- /Pre-release/
1226+{-# INLINE cmp #-}
1227+cmp :: MonadIO m => Array a -> Array a -> m Bool
1228+cmp arr1 arr2 =
1229+ liftIO $ do
1230+ let ptr1 = unsafeForeignPtrToPtr $ aStart arr1
1231+ let ptr2 = unsafeForeignPtrToPtr $ aStart arr2
1232+ let len1 = aEnd arr1 `minusPtr` ptr1
1233+ let len2 = aEnd arr2 `minusPtr` ptr2
1234+
1235+ if len1 == len2
1236+ then
1237+ if ptr1 == ptr2
1238+ then return True
1239+ else do
12371240 r <- memcmp (castPtr ptr1) (castPtr ptr2) len1
12381241 touchForeignPtr $ aStart arr1
12391242 touchForeignPtr $ aStart arr2
12401243 return r
1241− else return False
1242− in res
1243−
1244−-- XXX we are assuming that Storable equality means element equality. This may
1245−-- or may not be correct? arrcmp is 40% faster compared to stream equality.
1246−instance (Storable a, Eq a) => Eq (Array a) where
1247− {-# INLINE (==) #-}
1248− (==) = arrcmp
1249− -- arr1 == arr2 = runIdentity $ D.eqBy (==) (toStreamD arr1) (toStreamD arr2)
1244+ else return False
12501245
12511246-------------------------------------------------------------------------------
12521247-- NFData