massiv 0.5.0.0 → 0.5.1.0
raw patch · 13 files changed
+2681/−1920 lines, 13 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.Massiv.Array: cons :: e -> Array DL Ix1 e -> Array DL Ix1 e
- Data.Massiv.Array: snoc :: Array DL Ix1 e -> e -> Array DL Ix1 e
- Data.Massiv.Array: unconsM :: (MonadThrow m, Source r Ix1 e) => Array r Ix1 e -> m (e, Array D Ix1 e)
- Data.Massiv.Array: unsnocM :: (MonadThrow m, Source r Ix1 e) => Array r Ix1 e -> m (Array D Ix1 e, e)
+ Data.Massiv.Array: isNotEmpty :: Load r ix e => Array r ix e -> Bool
+ Data.Massiv.Array.Unsafe: unsafeFromListN :: Sz1 -> [e] -> Vector DS e
+ Data.Massiv.Array.Unsafe: unsafeUnfoldrN :: Sz1 -> (s -> Maybe (e, s)) -> s -> Vector DS e
+ Data.Massiv.Array.Unsafe: unsafeUnfoldrNM :: Monad m => Sz1 -> (s -> m (Maybe (e, s))) -> s -> m (Vector DS e)
+ Data.Massiv.Vector: (...) :: Index ix => ix -> ix -> Array D ix ix
+ Data.Massiv.Vector: (..:) :: Index ix => ix -> ix -> Array D ix ix
+ Data.Massiv.Vector: clone :: Mutable r ix e => Array r ix e -> Array r ix e
+ Data.Massiv.Vector: compute :: forall r ix e r'. (Mutable r ix e, Load r' ix e) => Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: computeAs :: (Mutable r ix e, Load r' ix e) => r -> Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: computeIO :: forall r ix e r' m. (Mutable r ix e, Load r' ix e, MonadIO m) => Array r' ix e -> m (Array r ix e)
+ Data.Massiv.Vector: computePrimM :: forall r ix e r' m. (Mutable r ix e, Load r' ix e, PrimMonad m) => Array r' ix e -> m (Array r ix e)
+ Data.Massiv.Vector: computeProxy :: (Mutable r ix e, Load r' ix e) => proxy r -> Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: computeS :: forall r ix e r'. (Mutable r ix e, Load r' ix e) => Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: computeSource :: forall r ix e r'. (Mutable r ix e, Source r' ix e) => Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: computeWithStride :: forall r ix e r'. (Mutable r ix e, StrideLoad r' ix e) => Stride ix -> Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: computeWithStrideAs :: (Mutable r ix e, StrideLoad r' ix e) => r -> Stride ix -> Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: cons :: e -> Vector DL e -> Vector DL e
+ Data.Massiv.Vector: convert :: forall r ix e r'. (Mutable r ix e, Load r' ix e) => Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: convertAs :: (Mutable r ix e, Load r' ix e) => r -> Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: convertProxy :: (Mutable r ix e, Load r' ix e) => proxy r -> Array r' ix e -> Array r ix e
+ Data.Massiv.Vector: enumFromN :: Num e => Comp -> e -> Sz1 -> Vector D e
+ Data.Massiv.Vector: enumFromStepN :: Num e => Comp -> e -> e -> Sz1 -> Vector D e
+ Data.Massiv.Vector: fromList :: forall r e. Mutable r Ix1 e => Comp -> [e] -> Array r Ix1 e
+ Data.Massiv.Vector: index :: Manifest r ix e => Array r ix e -> ix -> Maybe e
+ Data.Massiv.Vector: index' :: Manifest r ix e => Array r ix e -> ix -> e
+ Data.Massiv.Vector: infix 4 ..:
+ Data.Massiv.Vector: maxSize :: Load r ix e => Array r ix e -> Maybe (Sz ix)
+ Data.Massiv.Vector: size :: Load r ix e => Array r ix e -> Sz ix
+ Data.Massiv.Vector: snoc :: Vector DL e -> e -> Vector DL e
+ Data.Massiv.Vector: unconsM :: (MonadThrow m, Source r Ix1 e) => Vector r e -> m (e, Vector D e)
+ Data.Massiv.Vector: unsnocM :: (MonadThrow m, Source r Ix1 e) => Vector r e -> m (Vector D e, e)
- Data.Massiv.Array: enumFromN :: Num e => Comp -> e -> Sz1 -> Array D Ix1 e
+ Data.Massiv.Array: enumFromN :: Num e => Comp -> e -> Sz1 -> Vector D e
- Data.Massiv.Array: enumFromStepN :: Num e => Comp -> e -> e -> Sz1 -> Array D Ix1 e
+ Data.Massiv.Array: enumFromStepN :: Num e => Comp -> e -> e -> Sz1 -> Vector D e
- Data.Massiv.Array: iforM :: forall r ix b r' a m. (Source r' ix a, Mutable r ix b, Monad m) => (ix -> a -> m b) -> Array r' ix a -> m (Array r ix b)
+ Data.Massiv.Array: iforM :: forall r ix b r' a m. (Source r' ix a, Mutable r ix b, Monad m) => Array r' ix a -> (ix -> a -> m b) -> m (Array r ix b)
- Data.Massiv.Core: [IndexDimensionException] :: (Show ix, Typeable ix) => !ix -> !Dim -> IndexException
+ Data.Massiv.Core: [IndexDimensionException] :: (NFData ix, Show ix, Typeable ix) => !ix -> !Dim -> IndexException
- Data.Massiv.Core.Index: [IndexDimensionException] :: (Show ix, Typeable ix) => !ix -> !Dim -> IndexException
+ Data.Massiv.Core.Index: [IndexDimensionException] :: (NFData ix, Show ix, Typeable ix) => !ix -> !Dim -> IndexException
- Data.Massiv.Vector: infixl 4 !?
+ Data.Massiv.Vector: infixl 4 !
- Data.Massiv.Vector: sfromListN :: Int -> [e] -> Vector DS e
+ Data.Massiv.Vector: sfromListN :: Sz1 -> [e] -> Vector DS e
- Data.Massiv.Vector: sizipWith :: (Stream ra ix a, Stream rb ix b) => (ix -> a -> b -> c) -> Array ra ix a -> Array rb ix b -> Vector DS c
+ Data.Massiv.Vector: sizipWith :: (Stream ra Ix1 a, Stream rb Ix1 b) => (Ix1 -> a -> b -> c) -> Vector ra a -> Vector rb b -> Vector DS c
- Data.Massiv.Vector: sizipWith3 :: (Stream ra ix a, Stream rb ix b, Stream rc ix c) => (ix -> a -> b -> c -> d) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Vector DS d
+ Data.Massiv.Vector: sizipWith3 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c) => (Ix1 -> a -> b -> c -> d) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector DS d
- Data.Massiv.Vector: sizipWith3M :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Monad m) => (ix -> a -> b -> c -> m d) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> m (Vector DS d)
+ Data.Massiv.Vector: sizipWith3M :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Monad m) => (Ix1 -> a -> b -> c -> m d) -> Vector ra a -> Vector rb b -> Vector rc c -> m (Vector DS d)
- Data.Massiv.Vector: sizipWith3M_ :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Monad m) => (ix -> a -> b -> c -> m d) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> m ()
+ Data.Massiv.Vector: sizipWith3M_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Monad m) => (Ix1 -> a -> b -> c -> m d) -> Vector ra a -> Vector rb b -> Vector rc c -> m ()
- Data.Massiv.Vector: sizipWith4 :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Stream rd ix d) => (ix -> a -> b -> c -> d -> e) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Array rd ix d -> Vector DS e
+ Data.Massiv.Vector: sizipWith4 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d) => (Ix1 -> a -> b -> c -> d -> e) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector DS e
- Data.Massiv.Vector: sizipWith4M :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Stream rd ix d, Monad m) => (ix -> a -> b -> c -> d -> m e) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Array rd ix d -> m (Vector DS e)
+ Data.Massiv.Vector: sizipWith4M :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Monad m) => (Ix1 -> a -> b -> c -> d -> m e) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> m (Vector DS e)
- Data.Massiv.Vector: sizipWith4M_ :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Stream rd ix d, Monad m) => (ix -> a -> b -> c -> d -> m e) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Array rd ix d -> m ()
+ Data.Massiv.Vector: sizipWith4M_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Monad m) => (Ix1 -> a -> b -> c -> d -> m e) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> m ()
- Data.Massiv.Vector: sizipWith5 :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Stream rd ix d, Stream re ix e) => (ix -> a -> b -> c -> d -> e -> f) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Array rd ix d -> Array re ix e -> Vector DS f
+ Data.Massiv.Vector: sizipWith5 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e) => (Ix1 -> a -> b -> c -> d -> e -> f) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector DS f
- Data.Massiv.Vector: sizipWith5M :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Stream rd ix d, Stream re ix e, Monad m) => (ix -> a -> b -> c -> d -> e -> m f) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Array rd ix d -> Array re ix e -> m (Vector DS f)
+ Data.Massiv.Vector: sizipWith5M :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Monad m) => (Ix1 -> a -> b -> c -> d -> e -> m f) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> m (Vector DS f)
- Data.Massiv.Vector: sizipWith5M_ :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Stream rd ix d, Stream re ix e, Monad m) => (ix -> a -> b -> c -> d -> e -> m f) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Array rd ix d -> Array re ix e -> m ()
+ Data.Massiv.Vector: sizipWith5M_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Monad m) => (Ix1 -> a -> b -> c -> d -> e -> m f) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> m ()
- Data.Massiv.Vector: sizipWith6 :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Stream rd ix d, Stream re ix e, Stream rf ix f) => (ix -> a -> b -> c -> d -> e -> f -> g) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Array rd ix d -> Array re ix e -> Array rf ix f -> Vector DS g
+ Data.Massiv.Vector: sizipWith6 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Stream rf Ix1 f) => (Ix1 -> a -> b -> c -> d -> e -> f -> g) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector rf f -> Vector DS g
- Data.Massiv.Vector: sizipWith6M :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Stream rd ix d, Stream re ix e, Stream rf ix f, Monad m) => (ix -> a -> b -> c -> d -> e -> f -> m g) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Array rd ix d -> Array re ix e -> Array rf ix f -> m (Vector DS g)
+ Data.Massiv.Vector: sizipWith6M :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Stream rf Ix1 f, Monad m) => (Ix1 -> a -> b -> c -> d -> e -> f -> m g) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector rf f -> m (Vector DS g)
- Data.Massiv.Vector: sizipWith6M_ :: (Stream ra ix a, Stream rb ix b, Stream rc ix c, Stream rd ix d, Stream re ix e, Stream rf ix f, Monad m) => (ix -> a -> b -> c -> d -> e -> f -> m g) -> Array ra ix a -> Array rb ix b -> Array rc ix c -> Array rd ix d -> Array re ix e -> Array rf ix f -> m ()
+ Data.Massiv.Vector: sizipWith6M_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Stream rf Ix1 f, Monad m) => (Ix1 -> a -> b -> c -> d -> e -> f -> m g) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector rf f -> m ()
- Data.Massiv.Vector: sizipWithM :: (Stream ra ix a, Stream rb ix b, Monad m) => (ix -> a -> b -> m c) -> Array ra ix a -> Array rb ix b -> m (Vector DS c)
+ Data.Massiv.Vector: sizipWithM :: (Stream ra Ix1 a, Stream rb Ix1 b, Monad m) => (Ix1 -> a -> b -> m c) -> Vector ra a -> Vector rb b -> m (Vector DS c)
- Data.Massiv.Vector: sizipWithM_ :: (Stream ra ix a, Stream rb ix b, Monad m) => (ix -> a -> b -> m c) -> Array ra ix a -> Array rb ix b -> m ()
+ Data.Massiv.Vector: sizipWithM_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Monad m) => (Ix1 -> a -> b -> m c) -> Vector ra a -> Vector rb b -> m ()
- Data.Massiv.Vector: snull :: Stream r ix e => Array r ix e -> Bool
+ Data.Massiv.Vector: snull :: Load r ix e => Array r ix e -> Bool
- Data.Massiv.Vector: szip :: (Stream ra ixa a, Stream rb ixb b) => Array ra ixa a -> Array rb ixb b -> Vector DS (a, b)
+ Data.Massiv.Vector: szip :: (Stream ra Ix1 a, Stream rb Ix1 b) => Vector ra a -> Vector rb b -> Vector DS (a, b)
- Data.Massiv.Vector: szip3 :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c) => Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Vector DS (a, b, c)
+ Data.Massiv.Vector: szip3 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c) => Vector ra a -> Vector rb b -> Vector rc c -> Vector DS (a, b, c)
- Data.Massiv.Vector: szip4 :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d) => Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Vector DS (a, b, c, d)
+ Data.Massiv.Vector: szip4 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d) => Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector DS (a, b, c, d)
- Data.Massiv.Vector: szip5 :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Stream re ixe e) => Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Array re ixe e -> Vector DS (a, b, c, d, e)
+ Data.Massiv.Vector: szip5 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e) => Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector DS (a, b, c, d, e)
- Data.Massiv.Vector: szip6 :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Stream re ixe e, Stream rf ixf f) => Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Array re ixe e -> Array rf ixf f -> Vector DS (a, b, c, d, e, f)
+ Data.Massiv.Vector: szip6 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Stream rf Ix1 f) => Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector rf f -> Vector DS (a, b, c, d, e, f)
- Data.Massiv.Vector: szipWith :: (Stream ra ixa a, Stream rb ixb b) => (a -> b -> c) -> Array ra ixa a -> Array rb ixb b -> Vector DS c
+ Data.Massiv.Vector: szipWith :: (Stream ra Ix1 a, Stream rb Ix1 b) => (a -> b -> c) -> Vector ra a -> Vector rb b -> Vector DS c
- Data.Massiv.Vector: szipWith3 :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c) => (a -> b -> c -> d) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Vector DS d
+ Data.Massiv.Vector: szipWith3 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c) => (a -> b -> c -> d) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector DS d
- Data.Massiv.Vector: szipWith3M :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Monad m) => (a -> b -> c -> m d) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> m (Vector DS d)
+ Data.Massiv.Vector: szipWith3M :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Monad m) => (a -> b -> c -> m d) -> Vector ra a -> Vector rb b -> Vector rc c -> m (Vector DS d)
- Data.Massiv.Vector: szipWith3M_ :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Monad m) => (a -> b -> c -> m d) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> m ()
+ Data.Massiv.Vector: szipWith3M_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Monad m) => (a -> b -> c -> m d) -> Vector ra a -> Vector rb b -> Vector rc c -> m ()
- Data.Massiv.Vector: szipWith4 :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d) => (a -> b -> c -> d -> e) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Vector DS e
+ Data.Massiv.Vector: szipWith4 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d) => (a -> b -> c -> d -> e) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector DS e
- Data.Massiv.Vector: szipWith4M :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Monad m) => (a -> b -> c -> d -> m e) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> m (Vector DS e)
+ Data.Massiv.Vector: szipWith4M :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Monad m) => (a -> b -> c -> d -> m e) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> m (Vector DS e)
- Data.Massiv.Vector: szipWith4M_ :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Monad m) => (a -> b -> c -> d -> m e) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> m ()
+ Data.Massiv.Vector: szipWith4M_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Monad m) => (a -> b -> c -> d -> m e) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> m ()
- Data.Massiv.Vector: szipWith5 :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Stream re ixe e) => (a -> b -> c -> d -> e -> f) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Array re ixe e -> Vector DS f
+ Data.Massiv.Vector: szipWith5 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e) => (a -> b -> c -> d -> e -> f) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector DS f
- Data.Massiv.Vector: szipWith5M :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Stream re ixe e, Monad m) => (a -> b -> c -> d -> e -> m f) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Array re ixe e -> m (Vector DS f)
+ Data.Massiv.Vector: szipWith5M :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Monad m) => (a -> b -> c -> d -> e -> m f) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> m (Vector DS f)
- Data.Massiv.Vector: szipWith5M_ :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Stream re ixe e, Monad m) => (a -> b -> c -> d -> e -> m f) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Array re ixe e -> m ()
+ Data.Massiv.Vector: szipWith5M_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Monad m) => (a -> b -> c -> d -> e -> m f) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> m ()
- Data.Massiv.Vector: szipWith6 :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Stream re ixe e, Stream rf ixf f) => (a -> b -> c -> d -> e -> f -> g) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Array re ixe e -> Array rf ixf f -> Vector DS g
+ Data.Massiv.Vector: szipWith6 :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Stream rf Ix1 f) => (a -> b -> c -> d -> e -> f -> g) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector rf f -> Vector DS g
- Data.Massiv.Vector: szipWith6M :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Stream re ixe e, Stream rf ixf f, Monad m) => (a -> b -> c -> d -> e -> f -> m g) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Array re ixe e -> Array rf ixf f -> m (Vector DS g)
+ Data.Massiv.Vector: szipWith6M :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Stream rf Ix1 f, Monad m) => (a -> b -> c -> d -> e -> f -> m g) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector rf f -> m (Vector DS g)
- Data.Massiv.Vector: szipWith6M_ :: (Stream ra ixa a, Stream rb ixb b, Stream rc ixc c, Stream rd ixd d, Stream re ixe e, Stream rf ixf f, Monad m) => (a -> b -> c -> d -> e -> f -> m g) -> Array ra ixa a -> Array rb ixb b -> Array rc ixc c -> Array rd ixd d -> Array re ixe e -> Array rf ixf f -> m ()
+ Data.Massiv.Vector: szipWith6M_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Stream rc Ix1 c, Stream rd Ix1 d, Stream re Ix1 e, Stream rf Ix1 f, Monad m) => (a -> b -> c -> d -> e -> f -> m g) -> Vector ra a -> Vector rb b -> Vector rc c -> Vector rd d -> Vector re e -> Vector rf f -> m ()
- Data.Massiv.Vector: szipWithM :: (Stream ra ixa a, Stream rb ixb b, Monad m) => (a -> b -> m c) -> Array ra ixa a -> Array rb ixb b -> m (Vector DS c)
+ Data.Massiv.Vector: szipWithM :: (Stream ra Ix1 a, Stream rb Ix1 b, Monad m) => (a -> b -> m c) -> Vector ra a -> Vector rb b -> m (Vector DS c)
- Data.Massiv.Vector: szipWithM_ :: (Stream ra ixa a, Stream rb ixb b, Monad m) => (a -> b -> m c) -> Array ra ixa a -> Array rb ixb b -> m ()
+ Data.Massiv.Vector: szipWithM_ :: (Stream ra Ix1 a, Stream rb Ix1 b, Monad m) => (a -> b -> m c) -> Vector ra a -> Vector rb b -> m ()
Files
- CHANGELOG.md +10/−0
- massiv.cabal +1/−1
- src/Data/Massiv/Array.hs +1/−1
- src/Data/Massiv/Array/Delayed/Stream.hs +3/−0
- src/Data/Massiv/Array/Mutable.hs +2/−1
- src/Data/Massiv/Array/Ops/Construct.hs +43/−16
- src/Data/Massiv/Array/Ops/Map.hs +8/−8
- src/Data/Massiv/Array/Ops/Transform.hs +15/−104
- src/Data/Massiv/Core/Common.hs +49/−20
- src/Data/Massiv/Core/Index/Internal.hs +18/−2
- src/Data/Massiv/Vector.hs +2462/−1764
- src/Data/Massiv/Vector/Stream.hs +18/−3
- src/Data/Massiv/Vector/Unsafe.hs +51/−0
CHANGELOG.md view
@@ -1,3 +1,13 @@+# 0.5.1++* Fix `sfromListN` accepting a plain `Int` instead of `Sz1`, as well as switch to upper bound.+* Fix order of argumetns in `iforM`+* Restrict `szip*`, `szipWith*` and `sizipWith*` functions to flat vectors.+* Addition of `unsafeSUnfoldrN`, `unsafeSUnfoldrNM` and `unsafeSFromListN`+* Fix `sunfoldrN`, `sunfoldrNM` and `sfromListN` to not trust the supplied size.+* Move `isEmpty` into `Load` class+* Add `isNotEmpty`+ # 0.5.0 * Remove `Show` instance from `Value`.
massiv.cabal view
@@ -1,5 +1,5 @@ name: massiv-version: 0.5.0.0+version: 0.5.1.0 synopsis: Massiv (Массив) is an Array Library. description: Multi-dimensional Arrays with fusion, stencils and parallel computation. homepage: https://github.com/lehins/massiv
src/Data/Massiv/Array.hs view
@@ -104,6 +104,7 @@ , size , elemsCount , isEmpty+ , isNotEmpty -- * Indexing , (!?) , (!)@@ -149,7 +150,6 @@ import Data.Massiv.Vector import Data.Massiv.Array.Delayed-import Data.Massiv.Array.Delayed.Stream import Data.Massiv.Array.Manifest import Data.Massiv.Array.Manifest.Internal import Data.Massiv.Array.Manifest.List
src/Data/Massiv/Array/Delayed/Stream.hs view
@@ -186,6 +186,9 @@ maxSize = coerce . upperBound . stepsSize . dsArray {-# INLINE maxSize #-} + isEmpty = S.unId . S.null . coerce+ {-# INLINE isEmpty #-}+ getComp _ = Seq {-# INLINE getComp #-}
src/Data/Massiv/Array/Mutable.hs view
@@ -532,7 +532,8 @@ generateArray comp sz f = generateArrayLinear comp sz (f . fromLinearIndex sz) {-# INLINE generateArray #-} --- | Just like `generateArrayIO`, but action supplied will receive a row-major linear index.+-- | Just like `generateArray`, except generating action will receive a row-major linear+-- index. -- -- @since 0.3.0 generateArrayLinear ::
src/Data/Massiv/Array/Ops/Construct.hs view
@@ -469,6 +469,8 @@ -- | Same as `range`, but with a custom step. --+-- /__Throws Exceptions__/: `IndexZeroException`+-- -- ==== __Examples__ -- -- >>> import Data.Massiv.Array@@ -537,10 +539,10 @@ -- -- @since 0.3.0 rangeSize :: Index ix =>- Comp- -> ix -- ^ @x@ - start value- -> Sz ix -- ^ @sz@ - Size of resulting array- -> Array D ix ix+ Comp -- ^ Computation strategy+ -> ix -- ^ @x@ - start value+ -> Sz ix -- ^ @sz@ - Size of resulting array+ -> Array D ix ix rangeSize comp !from !sz = makeArray comp sz (liftIndex2 (+) from) {-# INLINE rangeSize #-} @@ -548,7 +550,7 @@ -- -- @since 0.3.0 rangeStepSize :: Index ix =>- Comp+ Comp -- ^ Computation strategy -> ix -- ^ @x@ - start value -> ix -- ^ @delta@ - step value -> Sz ix -- ^ @sz@ - Size of resulting array@@ -558,8 +560,11 @@ {-# INLINE rangeStepSize #-} --- | Same as `enumFromStepN` with step @delta = 1@.+-- | Same as `enumFromStepN` with step @dx = 1@. --+-- /Related/: `Data.Massiv.Vector.senumFromN`, `Data.Massiv.Vector.senumFromStepN`,+-- `enumFromStepN`, `rangeSize`, `rangeStepSize`, `range`+-- -- ==== __Examples__ -- -- >>> import Data.Massiv.Array@@ -567,36 +572,58 @@ -- Array D Seq (Sz1 3) -- [ 5.0, 6.0, 7.0 ] --+-- __/Similar/__:+--+-- [@Prelude.`Prelude.enumFromTo`@] Very similar to @[i .. i + n - 1]@, except that+-- `senumFromN` is faster, but it only works for `Num` and not for `Enum` elements+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.enumFromN`@]+-- -- @since 0.1.0 enumFromN :: Num e => Comp -> e -- ^ @x@ - start value -> Sz1 -- ^ @n@ - length of resulting vector.- -> Array D Ix1 e-enumFromN comp !from !sz = makeArray comp sz $ \ i -> fromIntegral i + from+ -> Vector D e+enumFromN comp !from !sz = makeArrayLinear comp sz $ \ i -> from + fromIntegral i {-# INLINE enumFromN #-} --- | Create a vector with length @n@ that has it's 0th value set to @x@ and gradually increasing--- with @step@ delta until the end. Similar to: @`Data.Massiv.Array.fromList'` `Seq` $ `take` n [x,--- x + delta ..]@. Major difference is that `fromList` constructs an `Array` with manifest--- representation, while `enumFromStepN` is delayed.+-- | Enumerate from a starting number @x@ exactly @n@ times with a custom step value+-- @dx@. Unlike `Data.Massiv.Vector.senumFromStepN`, there is no dependency on neigboring+-- elements therefore `enumFromStepN` is parallelizable. --+-- /Related/: `Data.Massiv.Vector.senumFromN`, `Data.Massiv.Vector.senumFromStepN`,+-- `enumFromN`, `rangeSize`, `rangeStepSize`, `range`, `rangeStepM`+-- -- ==== __Examples__ -- -- >>> import Data.Massiv.Array -- >>> enumFromStepN Seq 1 (0.1 :: Double) 5 -- Array D Seq (Sz1 5) -- [ 1.0, 1.1, 1.2, 1.3, 1.4 ]+-- >>> enumFromStepN Seq (-pi :: Float) (pi/4) 9+-- Array D Seq (Sz1 9)+-- [ -3.1415927, -2.3561945, -1.5707964, -0.78539824, 0.0, 0.78539824, 1.5707963, 2.3561947, 3.1415927 ] --+-- __/Similar/__:+--+-- [@Prelude.`Prelude.enumFrom`@] Similar to @take n [x, x + dx ..]@, except that+-- `enumFromStepN` is parallelizable and it only works for `Num` and not for `Enum`+-- elements. Floating point value will be slightly different as well.+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.enumFromStepN`@] Similar in the+-- outcome, but very different in the way it works.+--+-- -- @since 0.1.0 enumFromStepN :: Num e => Comp- -> e -- ^ @x@ - start value- -> e -- ^ @delta@ - step value+ -> e -- ^ @x@ - start number+ -> e -- ^ @dx@ - step number -> Sz1 -- ^ @n@ - length of resulting vector- -> Array D Ix1 e-enumFromStepN comp !from !step !sz = makeArray comp sz $ \ i -> from + fromIntegral i * step+ -> Vector D e+enumFromStepN comp !from !step !sz = makeArrayLinear comp sz $ \ i -> from + fromIntegral i * step {-# INLINE enumFromStepN #-}
src/Data/Massiv/Array/Ops/Map.hs view
@@ -165,7 +165,7 @@ {-# INLINE izipWith3 #-} --- | Similar to `zipWith`, except does it sequentiall and using the `Applicative`. Note that+-- | Similar to `zipWith`, except does it sequentially and using the `Applicative`. Note that -- resulting array has Mutable representation. -- -- @since 0.3.0@@ -383,7 +383,7 @@ {-# INLINE forM #-} --- | Map a monadic action over an array sequentially.+-- | Map an index aware monadic action over an array sequentially. -- -- @since 0.2.6 imapM ::@@ -395,15 +395,15 @@ {-# INLINE imapM #-} --- | Same as `forM`, except map an index aware action.+-- | Same as `forM`, except with an index aware action. ----- @since 0.2.6+-- @since 0.5.1 iforM :: forall r ix b r' a m. (Source r' ix a, Mutable r ix b, Monad m)- => (ix -> a -> m b)- -> Array r' ix a+ => Array r' ix a+ -> (ix -> a -> m b) -> m (Array r ix b)-iforM = itraverseA+iforM = flip itraverseA {-# INLINE iforM #-} @@ -503,7 +503,7 @@ {-# INLINE iforSchedulerM_ #-} --- | Same as `mapIO` but map an index aware action instead.+-- | Same as `mapIO` but map an index aware action instead. Respects computation strategy. -- -- @since 0.2.6 imapIO ::
src/Data/Massiv/Array/Ops/Transform.hs view
@@ -37,14 +37,6 @@ , deleteColumnsM , deleteRegionM -- ** Append/Split- , cons- , unconsM- -- , headM- -- , head'- , snoc- , unsnocM- -- , lastM- -- , last' , appendOuterM , appendM , append'@@ -398,97 +390,6 @@ {-# INLINE backpermute' #-} --- | /O(1)/ - Add an element to the vector from the left side------ @since 0.3.0-cons :: e -> Array DL Ix1 e -> Array DL Ix1 e-cons e arr =- arr- { dlSize = SafeSz (1 + unSz (dlSize arr))- , dlLoad =- \scheduler startAt uWrite ->- uWrite startAt e >> dlLoad arr scheduler (startAt + 1) uWrite- }-{-# INLINE cons #-}----- -- | /O(1)/ - Take the first element off the vector from the left side.--- ----- -- @since 0.4.3--- headM :: (MonadThrow m, Source r Ix1 e) => Array r Ix1 e -> m e--- headM = fmap fst . unconsM--- {-# INLINE headM #-}---- -- | /O(1)/ - Take the first element off the vector from the left side. Throws--- -- `SizeEmptyException`--- ----- -- @since 0.4.3--- head' :: Source r Ix1 e => Array r Ix1 e -> e--- head' = either throw id . headM--- {-# INLINE head' #-}----- -- | /O(1)/ - Take the last element off the vector from the right side.--- ----- -- @since 0.4.3--- lastM :: (MonadThrow m, Source r Ix1 e) => Array r Ix1 e -> m e--- lastM = fmap snd . unsnocM--- {-# INLINE lastM #-}---- -- | /O(1)/ - Take the last element off the vector from the right side. Throws--- -- `SizeEmptyException`--- ----- -- @since 0.4.3--- last' :: Source r Ix1 e => Array r Ix1 e -> e--- last' = either throw id . lastM--- {-# INLINE last' #-}------ | /O(1)/ - Take one element off the vector from the left side.------ @since 0.3.0-unconsM :: (MonadThrow m, Source r Ix1 e) => Array r Ix1 e -> m (e, Array D Ix1 e)-unconsM arr- | 0 == totalElem sz = throwM $ SizeEmptyException sz- | otherwise =- pure- ( unsafeLinearIndex arr 0- , makeArray (getComp arr) (SafeSz (unSz sz - 1)) (\ !i -> unsafeLinearIndex arr (i + 1)))- where- !sz = size arr-{-# INLINE unconsM #-}---- | /O(1)/ - Add an element to the vector from the right side------ @since 0.3.0-snoc :: Array DL Ix1 e -> e -> Array DL Ix1 e-snoc arr e =- arr- { dlSize = SafeSz (1 + k)- , dlLoad =- \scheduler startAt uWrite -> dlLoad arr scheduler startAt uWrite >> uWrite (k + startAt) e- }- where- !k = unSz (size arr)-{-# INLINE snoc #-}----- | /O(1)/ - Take one element off the vector from the right side.------ @since 0.3.0-unsnocM :: (MonadThrow m, Source r Ix1 e) => Array r Ix1 e -> m (Array D Ix1 e, e)-unsnocM arr- | k < 0 = throwM $ SizeEmptyException sz- | otherwise =- pure (makeArray (getComp arr) (SafeSz k) (unsafeLinearIndex arr), unsafeLinearIndex arr k)- where- !sz = size arr- !k = unSz sz - 1-{-# INLINE unsnocM #-}--- -- | Append two arrays together along a particular dimension. Sizes of both arrays must match, with -- an allowed exception of the dimension they are being appended along, otherwise `Nothing` is -- returned.@@ -570,9 +471,10 @@ {-# INLINE concat' #-} -- | Concatenate many arrays together along some dimension. It is important that all sizes are--- equal, with an exception of the dimensions along which concatenation happens, otherwise it doues--- result in a `SizeMismatchException` exception.+-- equal, with an exception of the dimensions along which concatenation happens. --+-- /__Exceptions__/: `IndexDimensionException`, `SizeMismatchException`+-- -- @since 0.3.0 concatM :: (MonadThrow m, Foldable f, Source r ix e) => Dim -> f (Array r ix e) -> m (Array DL ix e)@@ -611,8 +513,12 @@ {-# INLINE concatM #-} --- | /O(1)/ - Split an array at an index along a specified dimension.+-- | /O(1)/ - Split an array into two at an index along a specified dimension. --+-- /Related/: `splitAt'`, `splitExtractM`, `Data.Massiv.Vector.sliceAt'`, `Data.Massiv.Vector.sliceAtM`+--+-- /__Exceptions__/: `IndexDimensionException`, `SizeSubregionException`+-- -- @since 0.3.0 splitAtM :: (MonadThrow m, Extract r ix e)@@ -629,8 +535,13 @@ return (arr1, arr2) {-# INLINE splitAtM #-} --- | Same as `splitAt`, but will throw an error instead of returning `Nothing` on wrong dimension--- and index out of bounds.+-- | /O(1)/ - Split an array into two at an index along a specified dimension. Throws an+-- error for a wrong dimension or incorrect indices.+--+-- /Related/: `splitAtM`, `splitExtractM`, `Data.Massiv.Vector.sliceAt'`, `Data.Massiv.Vector.sliceAtM`+--+-- ==== __Examples__+-- -- -- @since 0.1.0 splitAt' :: Extract r ix e =>
src/Data/Massiv/Core/Common.hs view
@@ -53,7 +53,7 @@ , singleton -- * Size , elemsCount- , isEmpty+ , isNotEmpty , Sz(SafeSz) , Size(..) -- * Indexing@@ -255,9 +255,10 @@ unsafeLinearIndex !arr = unsafeIndex arr . fromLinearIndex (size arr) {-# INLINE unsafeLinearIndex #-} - -- | Source arrays also give us ability to look at their linear slices+ -- | /O(1)/ - Source arrays also give us ability to look at their linear slices in+ -- constant time --- -- @since 0.4.1+ -- @since 0.5.0 unsafeLinearSlice :: Ix1 -> Sz1 -> Array r ix e -> Array r Ix1 e -- | Any array that can be computed and loaded into memory@@ -270,7 +271,9 @@ -- @since 0.1.0 getComp :: Array r ix e -> Comp - -- | Get the size of an immutabe array+ -- | Get the exact size of an immutabe array. Most of the time will produce the size in+ -- constant time, except for `DS` representation, which could result in evaluation of+ -- the whole stream. See `maxSize` and `Data.Massiv.Vector.slength` for more info. -- -- @since 0.1.0 size :: Array r ix e -> Sz ix@@ -291,14 +294,31 @@ {-# INLINE defaultElement #-} -- | /O(1)/ - Get the possible maximum size of an immutabe array. If the lookup of size- -- in constant time is not possible, `Nothing` should be returned. This value will be- -- used as the initial size of the mutable array in which loading will happen.+ -- in constant time is not possible, `Nothing` will be returned. This value will be used+ -- as the initial size of the mutable array into which the loading will happen. -- -- @since 0.5.0 maxSize :: Array r ix e -> Maybe (Sz ix) maxSize = Just . size {-# INLINE maxSize #-} ++ -- | /O(1)/ - Check if an array has no elements.+ --+ -- ==== __Examples__+ --+ -- >>> import Data.Massiv.Array+ -- >>> isEmpty $ range Seq (Ix2 10 20) (11 :. 21)+ -- False+ -- >>> isEmpty $ range Seq (Ix2 10 20) (10 :. 21)+ -- True+ --+ -- @since 0.1.0+ isEmpty :: Array r ix e -> Bool+ isEmpty !arr = 0 == elemsCount arr+ {-# INLINE isEmpty #-}++ -- | Load into a supplied mutable array sequentially. Returned array does not have to be -- the same --@@ -648,7 +668,7 @@ infixl 4 !, !?, ?? --- | Infix version of `index'`.+-- | /O(1)/ - Infix version of `index'`. -- -- ==== __Examples__ --@@ -670,8 +690,10 @@ {-# INLINE (!) #-} --- | Infix version of `indexM`.+-- | /O(1)/ - Infix version of `indexM`. --+-- /__Exceptions__/: `IndexOutOfBoundsException`+-- -- ==== __Examples__ -- -- >>> import Data.Massiv.Array as A@@ -699,6 +721,8 @@ -- `MonadThrow`. This operator is useful when used together with slicing or other -- functions that can fail. --+-- /__Exceptions__/: `IndexOutOfBoundsException`+-- -- ==== __Examples__ -- -- >>> import Data.Massiv.Array as A@@ -729,16 +753,17 @@ -- | /O(1)/ - Lookup an element in the array. Returns `Nothing`, when index is out of bounds and -- returns the element at the supplied index otherwise. Use `indexM` instead, since it is more--- generaland can just as well be used with `Maybe`.+-- general and it can just as well be used with `Maybe`. -- -- @since 0.1.0 index :: Manifest r ix e => Array r ix e -> ix -> Maybe e index = indexM {-# INLINE index #-} --- | /O(1)/ - Lookup an element in the array. Throws `IndexOutOfBoundsException`, when index is out--- of bounds and returns the element at the supplied index otherwise.+-- | /O(1)/ - Lookup an element in the array. --+-- /__Exceptions__/: `IndexOutOfBoundsException`+-- -- @since 0.3.0 indexM :: (Manifest r ix e, MonadThrow m) => Array r ix e -> ix -> m e indexM = evaluateM@@ -861,8 +886,11 @@ {-# INLINE imapM_ #-} --- | /O(1)/ - Get the number of elements in the array+-- | /O(1)/ - Get the number of elements in the array. --+-- /Note/ - It is always a constant time operation except for some arrays with+-- `Data.Massiv.Array.DS` representation. See `Data.Massiv.Vector.slength` for more info.+-- -- ==== __Examples__ -- -- >>> import Data.Massiv.Array@@ -874,17 +902,18 @@ elemsCount = totalElem . size {-# INLINE elemsCount #-} --- | /O(1)/ - Check if array has no elements.++-- | /O(1)/ - Check if array has elements. -- -- ==== __Examples__ -- -- >>> import Data.Massiv.Array--- >>> isEmpty $ range Seq (Ix2 10 20) (11 :. 21)--- False--- >>> isEmpty $ range Seq (Ix2 10 20) (10 :. 21)+-- >>> isNotEmpty (singleton 1 :: Array D Ix2 Int) -- True+-- >>> isNotEmpty (empty :: Array D Ix2 Int)+-- False ----- @since 0.1.0-isEmpty :: Load r ix e => Array r ix e -> Bool-isEmpty !arr = 0 == elemsCount arr-{-# INLINE isEmpty #-}+-- @since 0.5.1+isNotEmpty :: Load r ix e => Array r ix e -> Bool+isNotEmpty = not . isEmpty+{-# INLINE isNotEmpty #-}
src/Data/Massiv/Core/Index/Internal.hs view
@@ -7,6 +7,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE TypeFamilies #-}@@ -300,7 +301,7 @@ -- | A way to select Array dimension at a value level. -- -- @since 0.1.0-newtype Dim = Dim { unDim :: Int } deriving (Eq, Ord, Num, Real, Integral, Enum)+newtype Dim = Dim { unDim :: Int } deriving (Eq, Ord, Num, Real, Integral, Enum, NFData) instance Show Dim where show (Dim d) = "(Dim " ++ show d ++ ")"@@ -699,7 +700,7 @@ -- | Index contains a zero value along one of the dimensions. IndexZeroException :: Index ix => !ix -> IndexException -- | Dimension is out of reach.- IndexDimensionException :: (Show ix, Typeable ix) => !ix -> !Dim -> IndexException+ IndexDimensionException :: (NFData ix, Show ix, Typeable ix) => !ix -> !Dim -> IndexException -- | Index is out of bounds. IndexOutOfBoundsException :: Index ix => !(Sz ix) -> !ix -> IndexException @@ -721,6 +722,13 @@ show sz1 == show sz2 && show i1 == show i2 _ -> False +instance NFData IndexException where+ rnf =+ \case+ IndexZeroException i -> rnf i+ IndexDimensionException i d -> i `deepseq` rnf d+ IndexOutOfBoundsException sz i -> sz `deepseq` rnf i+ instance Exception IndexException -- | Exception that indicates an issue with an array size.@@ -747,6 +755,14 @@ show sz1 == show sz2 && show i1 == show i2 && show sz1' == show sz2' (SizeEmptyException sz1, SizeEmptyException sz2) -> show sz1 == show sz2 _ -> False++instance NFData SizeException where+ rnf =+ \case+ SizeMismatchException sz sz' -> sz `deepseq` rnf sz'+ SizeElementsMismatchException sz sz' -> sz `deepseq` rnf sz'+ SizeSubregionException sz i sz' -> sz `deepseq` i `deepseq` rnf sz'+ SizeEmptyException sz -> rnf sz instance Exception SizeException
src/Data/Massiv/Vector.hs view
@@ -1,1769 +1,2467 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE FlexibleContexts #-}--- |--- Module : Data.Massiv.Vector--- Copyright : (c) Alexey Kuleshevich 2020--- License : BSD3--- Maintainer : Alexey Kuleshevich <lehins@yandex.ru>--- Stability : experimental--- Portability : non-portable----module Data.Massiv.Vector- ( Vector- , MVector- -- * Accessors- -- *** Size- , slength- , snull- -- *** Indexing- , (!)- , (!?)- , head'- , shead'- , last'- -- *** Monadic Indexing- , indexM- , headM- , sheadM- , lastM- -- ** Slicing- , slice- , slice'- , sliceM- , sslice- , sliceAt- , sliceAt'- , sliceAtM- -- *** Init- , init- , init'- , initM- -- *** Tail- , tail- , tail'- , tailM- -- *** Take- , take- , take'- , takeM- , stake- -- *** Drop- , drop- , drop'- , dropM- , sdrop- -- * Construction- -- ** Initialization- , empty- , sempty- , singleton- , ssingleton- , A.replicate- , sreplicate- , generate- , sgenerate- -- , iterateN- -- , iiterateN- , siterateN- -- ** Monadic initialization- , sreplicateM- , sgenerateM- , siterateNM- -- , create- -- , createT- -- ** Unfolding- , sunfoldr- , sunfoldrM- , sunfoldrN- , sunfoldrNM- , sunfoldrExactN- , sunfoldrExactNM- -- , constructN- -- , constructrN- -- -- ** Enumeration- , senumFromN- , senumFromStepN- -- ** Concatenation- -- , consS -- cons- -- , snocS -- snoc- , sappend -- (++)- , sconcat -- concat- -- -- ** Restricitng memory usage- -- , force- -- -- * Modifying- -- -- ** Bulk updates- -- , (//)- -- , update_- -- -- ** Accumulations- -- , accum- -- , accumulate_- -- -- ** Permutations- -- , reverse- -- , backpermute- -- -- ** Mutable updates- -- , modify- -- -- * Elementwise- -- -- ** Mapping- , smap- , simap- -- , sconcatMap- -- ** Monadic mapping- , straverse- , sitraverse- , smapM- , smapM_- , simapM- , simapM_- , sforM- , sforM_- , siforM- , siforM_- -- ** Zipping- , szip- , szip3- , szip4- , szip5- , szip6- , szipWith- , szipWith3- , szipWith4- , szipWith5- , szipWith6- , sizipWith- , sizipWith3- , sizipWith4- , sizipWith5- , sizipWith6- -- ** Monadic zipping- , szipWithM- , szipWith3M- , szipWith4M- , szipWith5M- , szipWith6M- , sizipWithM- , sizipWith3M- , sizipWith4M- , sizipWith5M- , sizipWith6M-- , szipWithM_- , szipWith3M_- , szipWith4M_- , szipWith5M_- , szipWith6M_- , sizipWithM_- , sizipWith3M_- , sizipWith4M_- , sizipWith5M_- , sizipWith6M_- -- * Predicates- -- ** Filtering- , sfilter- , sifilter- , sfilterM- , sifilterM- -- , uniq -- sunique?- , smapMaybe- , smapMaybeM- , scatMaybes- , simapMaybe- , simapMaybeM- -- , takeWhile- -- , dropWhile- -- -- ** Partitioning- -- , partition- -- , unstablePartition- -- , partitionWith- -- , span- -- , break- -- -- ** Searching- -- , elem- -- , notElem- -- , find- -- , findIndex- -- , findIndices- -- , elemIndex- -- , elemIndices- -- * Folding- , sfoldl- , sfoldlM- , sfoldlM_- , sifoldl- , sifoldlM- , sifoldlM_- , sfoldl1'- , sfoldl1M- , sfoldl1M_- -- ** Specialized folds- , sor- , sand- , sall- , sany- , ssum- , sproduct- , smaximum'- , smaximumM- -- , maximumBy- , sminimum'- , sminimumM- -- , minimumBy- -- , minIndex- -- , minIndexBy- -- , maxIndex- -- , maxIndexBy- -- -- ** Prefix sums- -- , prescanl- -- , prescanl'- -- , postscanl- -- , postscanl'- -- , scanl- -- , scanl'- -- , scanl1- -- , scanl1'- -- , prescanr- -- , prescanr'- -- , postscanr- -- , postscanr'- -- , scanr- -- , scanr'- -- , scanr1- -- , scanr1'- -- * Conversions- -- ** Lists- , stoList- , sfromList- , sfromListN- -- -- ** Other vector types- -- , convert- -- -- ** Mutable vectors- -- , freeze- -- , thaw- -- , copy- -- , unsafeFreeze- -- , unsafeThaw- -- , unsafeCopy- -- * Deprecated- , takeS- , dropS- , unfoldr- , unfoldrN- , filterS- , ifilterS- , filterM- , ifilterM- , mapMaybeS- , imapMaybeS- , mapMaybeM- , imapMaybeM- , catMaybesS- , traverseS- ) where--import Control.Monad hiding (filterM, replicateM)-import Data.Coerce-import Data.Massiv.Array.Delayed.Pull-import Data.Massiv.Array.Delayed.Stream-import qualified Data.Massiv.Array.Ops.Construct as A (makeArrayR, replicate)-import Data.Massiv.Core.Common-import qualified Data.Massiv.Vector.Stream as S-import Data.Massiv.Vector.Unsafe-import Prelude hiding (drop, init, length, null, replicate, splitAt, tail, take)---- ========= ----- Accessors ----- ========= -------------------------------- Length information ------------------------------- | /O(1)/ - Get the length of a stream vector, but only if it is known excatly. Calling--- `size` will always give you the exact size instead, but for `DS` representation could--- result in evaluating of the whole stream.------ @since 0.5.0-slength :: Stream r ix e => Array r ix e -> Maybe Sz1-slength v =- case stepsSize (toStream v) of- Exact sz -> Just (SafeSz sz)- _ -> Nothing-{-# INLINE slength #-}---- | /O(1)/ - Check if a stream array is empty.------ @since 0.5.0-snull :: Stream r ix e => Array r ix e -> Bool-snull = S.unId . S.null . toStream-{-# INLINE snull #-}------------------- Indexing --------------------- TODO: Add to vector: headMaybe---- | Get the first element of a `Source` vector. Throws an error on empty.------ @since 0.5.0-head' :: Source r Ix1 e => Vector r e -> e-head' = either throw id . headM-{-# INLINE head' #-}----- | Get the first element of a `Source` vector. Throws an error on empty.------ @since 0.5.0-headM :: (Source r Ix1 e, MonadThrow m) => Vector r e -> m e-headM v- | isEmpty v = throwM $ SizeEmptyException (size v)- | otherwise = pure $ unsafeLinearIndex v 0-{-# INLINE headM #-}----- | Get the first element of a `Stream` vector. Throws an error on empty.------ @since 0.5.0-shead' :: Stream r Ix1 e => Vector r e -> e-shead' = either throw id . sheadM-{-# INLINE shead' #-}---- | Get the first element of a `Stream` vector. Throws an error on empty.------ @since 0.5.0-sheadM :: (Stream r Ix1 e, MonadThrow m) => Vector r e -> m e-sheadM v =- case S.unId (S.headMaybe (toStream v)) of- Nothing -> throwM $ SizeEmptyException (size v)- Just e -> pure e-{-# INLINE sheadM #-}---- | Get the last element of a `Source` vector. Throws an error on empty.------ @since 0.5.0-last' :: Source r Ix1 e => Vector r e -> e-last' = either throw id . lastM-{-# INLINE last' #-}----- | Get the last element of a `Source` vector. Throws an error on empty.------ @since 0.5.0-lastM :: (Source r Ix1 e, MonadThrow m) => Vector r e -> m e-lastM v- | k == 0 = throwM $ SizeEmptyException (size v)- | otherwise = pure $ unsafeLinearIndex v (k - 1)- where k = unSz (size v)-{-# INLINE lastM #-}----- | /O(1)/ - Take a slice of a `Source` vector. Never fails, instead adjusts the indices.------ @since 0.5.0-slice :: Source r Ix1 e => Ix1 -> Sz1 -> Vector r e -> Vector r e-slice !i (Sz k) v = unsafeLinearSlice i' newSz v- where- !i' = min n (max 0 i)- !newSz = SafeSz (min (n - i') k)- Sz n = size v-{-# INLINE slice #-}---- | /O(1)/ - Take a slice of a `Stream` vector. Never fails, instead adjusts the indices.------ @since 0.5.0-sslice :: Stream r Ix1 e => Ix1 -> Sz1 -> Vector r e -> Vector DS e-sslice !i (Sz k) = fromSteps . S.slice i k . S.toStream-{-# INLINE sslice #-}----- | /O(1)/ - Take a slice of a `Source` vector. Throws an error on incorrect indices.------ @since 0.5.0-slice' :: Source r Ix1 e => Ix1 -> Sz1 -> Vector r e -> Vector r e-slice' i k = either throw id . sliceM i k-{-# INLINE slice' #-}---- | /O(1)/ - Take a slice of a `Source` vector. Throws an error on incorrect indices.------ @since 0.5.0-sliceM :: (Source r Ix1 e, MonadThrow m) => Ix1 -> Sz1 -> Vector r e -> m (Vector r e)-sliceM i newSz@(Sz k) v- | i >= 0 && k <= n - i = pure $ unsafeLinearSlice i newSz v- | otherwise = throwM $ SizeSubregionException sz i newSz- where- sz@(Sz n) = size v-{-# INLINE sliceM #-}---- | /O(1)/ - Get the vector without the last element. Never fails------ @since 0.5.0-init :: Source r Ix1 e => Vector r e -> Vector r e-init v = unsafeLinearSlice 0 (Sz (coerce (size v) - 1)) v-{-# INLINE init #-}---- | /O(1)/ - Get the vector without the last element. Throws an error on empty------ @since 0.5.0-init' :: Source r Ix1 e => Vector r e -> Vector r e-init' = either throw id . initM-{-# INLINE init' #-}---- | /O(1)/ - Get the vector without the last element. Throws an error on empty------ @since 0.5.0-initM :: (Source r Ix1 e, MonadThrow m) => Vector r e -> m (Vector r e)-initM v = do- when (isEmpty v) $ throwM $ SizeEmptyException $ size v- pure $ unsafeInit v-{-# INLINE initM #-}------ | /O(1)/ - Get the vector without the first element. Never fails------ @since 0.5.0-tail :: Source r Ix1 e => Vector r e -> Vector r e-tail = drop 1-{-# INLINE tail #-}----- | /O(1)/ - Get the vector without the first element. Throws an error on empty------ @since 0.5.0-tail' :: Source r Ix1 e => Vector r e -> Vector r e-tail' = either throw id . tailM-{-# INLINE tail' #-}----- | /O(1)/ - Get the vector without the first element. Throws an error on empty------ @since 0.5.0-tailM :: (Source r Ix1 e, MonadThrow m) => Vector r e -> m (Vector r e)-tailM v = do- when (isEmpty v) $ throwM $ SizeEmptyException $ size v- pure $ unsafeTail v-{-# INLINE tailM #-}------ | /O(1)/ - Get the vector with the first @n@ elements. Never fails------ @since 0.5.0-take :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e-take k = fst . sliceAt k-{-# INLINE take #-}---- | /O(1)/ - Get the vector with the first @n@ elements. Throws an error size is less than @n@------ @since 0.5.0-take' :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e-take' k = either throw id . takeM k-{-# INLINE take' #-}---- | /O(1)/ - Get the vector with the first @n@ elements. Throws an error size is less than @n@------ @since 0.5.0-takeM :: (Source r Ix1 e, MonadThrow m) => Sz1 -> Vector r e -> m (Vector r e)-takeM k v = do- let sz = size v- when (k > sz) $ throwM $ SizeSubregionException sz 0 k- pure $ unsafeTake k v-{-# INLINE takeM #-}---- | /O(1)/ - Get a `Stream` vector with the first @n@ elements. Never fails------ @since 0.5.0-stake :: Stream r Ix1 e => Sz1 -> Vector r e -> Vector DS e-stake n = fromSteps . S.take (unSz n) . S.toStream-{-# INLINE stake #-}---- |------ @since 0.5.0-drop :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e-drop k = snd . sliceAt k-{-# INLINE drop #-}---- | Keep all but the first @n@ elements from the delayed stream vector.------ @since 0.5.0-sdrop :: Stream r Ix1 e => Sz1 -> Vector r e -> Vector DS e-sdrop n = fromSteps . S.drop (unSz n) . S.toStream-{-# INLINE sdrop #-}---- |------ @since 0.5.0-drop' :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e-drop' k = either throw id . dropM k-{-# INLINE drop' #-}---- |------ @since 0.5.0-dropM :: (Source r Ix1 e, MonadThrow m) => Sz1 -> Vector r e -> m (Vector r e)-dropM k@(Sz d) v = do- let sz@(Sz n) = size v- when (k > sz) $ throwM $ SizeSubregionException sz d (sz - k)- pure $ unsafeLinearSlice d (SafeSz (n - d)) v-{-# INLINE dropM #-}----- | Samel as `sliceAt`, except it never fails.--------- @since 0.5.0-sliceAt :: Source r Ix1 e => Sz1 -> Vector r e -> (Vector r e, Vector r e)-sliceAt (Sz k) v = (unsafeTake d v, unsafeDrop d v)- where- !n = coerce (size v)- !d = SafeSz (min k n)-{-# INLINE sliceAt #-}---- | Same as `Data.Massiv.Array.splitAt'`, except for a flat vector.------ @since 0.5.0-sliceAt' :: Source r Ix1 e => Sz1 -> Vector r e -> (Vector r e, Vector r e)-sliceAt' k = either throw id . sliceAtM k-{-# INLINE sliceAt' #-}---- | Same as `Data.Massiv.Array.splitAtM`, except for a flat vector.------ @since 0.5.0-sliceAtM :: (Source r Ix1 e, MonadThrow m) => Sz1 -> Vector r e -> m (Vector r e, Vector r e)-sliceAtM k v = do- l <- takeM k v- pure (l, unsafeDrop k v)-{-# INLINE sliceAtM #-}----- | Create an empty delayed stream vector------ @since 0.5.0-sempty :: Vector DS e-sempty = DSArray S.empty-{-# INLINE sempty #-}---- | Create a delayed stream vector with a single element------ @since 0.5.0-ssingleton :: e -> Vector DS e-ssingleton = DSArray . S.singleton-{-# INLINE ssingleton #-}---- | Replicate the same element @n@ times------ @since 0.5.0-sreplicate :: Sz1 -> e -> Vector DS e-sreplicate (Sz n) = DSArray . S.replicate n-{-# INLINE sreplicate #-}---- | Create a delayed vector of length @n@ with a function that maps an index to an--- element. Same as `makeLinearArray`------ @since 0.5.0-generate :: Comp -> Sz1 -> (Ix1 -> e) -> Vector D e-generate = makeArrayLinear-{-# INLINE generate #-}---- | Create a delayed stream vector of length @n@ with a function that maps an index to an--- element. Same as `makeLinearArray`------ @since 0.5.0-sgenerate :: Sz1 -> (Ix1 -> e) -> Vector DS e-sgenerate (Sz n) = DSArray . S.generate n-{-# INLINE sgenerate #-}----- | Create a delayed stream vector of length @n@ by repeatedly apply a function to the--- initial value.------ @since 0.5.0-siterateN :: Sz1 -> (e -> e) -> e -> Vector DS e-siterateN n f a = fromSteps $ S.iterateN (unSz n) f a-{-# INLINE siterateN #-}----- | Create a vector by using the same monadic action @n@ times------ @since 0.5.0-sreplicateM :: Monad m => Sz1 -> m e -> m (Vector DS e)-sreplicateM n f = fromStepsM $ S.replicateM (unSz n) f-{-# INLINE sreplicateM #-}----- | Create a delayed stream vector of length @n@ with a monadic action that from an index--- generates an element.------ @since 0.5.0-sgenerateM :: Monad m => Sz1 -> (Ix1 -> m e) -> m (Vector DS e)-sgenerateM n f = fromStepsM $ S.generateM (unSz n) f-{-# INLINE sgenerateM #-}----- | Create a delayed stream vector of length @n@ by repeatedly apply a monadic action to--- the initial value.------ @since 0.5.0-siterateNM :: Monad m => Sz1 -> (e -> m e) -> e -> m (Vector DS e)-siterateNM n f a = fromStepsM $ S.iterateNM (unSz n) f a-{-# INLINE siterateNM #-}------- | Right unfolding function. Useful when it is unknown ahead of time on how many--- elements the vector will have.------ ====__Example__------ >>> import Data.Massiv.Array as A--- >>> sunfoldr (\i -> if i < 9 then Just (i * i, i + 1) else Nothing) (0 :: Int)--- Array DS Seq (Sz1 9)--- [ 0, 1, 4, 9, 16, 25, 36, 49, 64 ]------ @since 0.5.0-sunfoldr :: (s -> Maybe (e, s)) -> s -> Vector DS e-sunfoldr f = DSArray . S.unfoldr f-{-# INLINE sunfoldr #-}------ | /O(n)/ - Right unfolding function with at most @n@ number of elements.------ ==== __Example__------ >>> import Data.Massiv.Array as A--- >>> sunfoldrN 9 (\i -> Just (i*i, i + 1)) (0 :: Int)--- Array DS Seq (Sz1 9)--- [ 0, 1, 4, 9, 16, 25, 36, 49, 64 ]------ @since 0.5.0-sunfoldrN ::- Sz1- -- ^ @n@ - maximum number of elements that the vector will have- -> (s -> Maybe (e, s))- -- ^ Unfolding function. Stops when `Nothing` is returned or maximum number of elements- -- is reached.- -> s -- ^ Inititial element.- -> Vector DS e-sunfoldrN (Sz n) f = DSArray . S.unfoldrN n f-{-# INLINE sunfoldrN #-}---- | Same as `unfoldr`, by with monadic generating function.------ @since 0.5.0-sunfoldrM :: Monad m => (s -> m (Maybe (e, s))) -> s -> m (Vector DS e)-sunfoldrM f = fromStepsM . S.unfoldrM f-{-# INLINE sunfoldrM #-}---- | Same as `unfoldrN`, by with monadic generating function.------ @since 0.5.0-sunfoldrNM :: Monad m => Sz1 -> (s -> m (Maybe (e, s))) -> s -> m (Vector DS e)-sunfoldrNM (Sz n) f = fromStepsM . S.unfoldrNM n f-{-# INLINE sunfoldrNM #-}----- | Similar to `unfoldrN`, except the length of the resulting vector will be exactly @n@------ @since 0.5.0-sunfoldrExactN :: Sz1 -> (s -> (e, s)) -> s -> Vector DS e-sunfoldrExactN (Sz n) f = fromSteps . S.unfoldrExactN n f-{-# INLINE sunfoldrExactN #-}---- | Similar to `unfoldrNM`, except the length of the resulting vector will be exactly @n@------ @since 0.5.0-sunfoldrExactNM :: Monad m => Sz1 -> (s -> m (e, s)) -> s -> m (Vector DS e)-sunfoldrExactNM (Sz n) f = fromStepsM . S.unfoldrExactNM n f-{-# INLINE sunfoldrExactNM #-}----- | Enumerate from a starting number @n@ times with a step @1@------ @since 0.5.0-senumFromN :: Num e => e -> Sz1 -> Vector DS e-senumFromN x (Sz n) = DSArray $ S.enumFromStepN x 1 n-{-# INLINE senumFromN #-}---- | Enumerate from a starting number @n@ times with a custom step value------ @since 0.5.0-senumFromStepN ::- Num e- => e -- ^ Starting value- -> e -- ^ Step- -> Sz1 -- ^ Resulting length of a vector- -> Vector DS e-senumFromStepN x step (Sz n) = DSArray $ S.enumFromStepN x step n-{-# INLINE senumFromStepN #-}------ | Append two vectors together------ @since 0.5.0-sappend :: (Stream r1 Ix1 e, Stream r2 Ix1 e) => Vector r1 e -> Vector r2 e -> Vector DS e-sappend a1 a2 = fromSteps (toStream a1 `S.append` toStream a2)-{-# INLINE sappend #-}----- | Concat vectors together------ @since 0.5.0-sconcat :: Stream r Ix1 e => [Vector r e] -> Vector DS e-sconcat = DSArray . foldMap toStream-{-# INLINE sconcat #-}---- | Convert a list to a delayed stream vector------ @since 0.5.0-sfromList :: [e] -> Vector DS e-sfromList = fromSteps . S.fromList-{-# INLINE sfromList #-}---- | Convert a list of a known length to a delayed stream vector------ @since 0.5.0-sfromListN :: Int -> [e] -> Vector DS e-sfromListN n = fromSteps . S.fromListN n-{-# INLINE sfromListN #-}---- | Convert an array to a list by the means of a delayed stream vector.------ @since 0.5.0-stoList :: Stream r ix e => Array r ix e -> [e]-stoList = S.toList . toStream-{-# INLINE stoList #-}--------- | Sequentially filter out elements from the array according to the supplied predicate.------ ==== __Example__------ >>> import Data.Massiv.Array as A--- >>> arr = makeArrayR D Seq (Sz2 3 4) fromIx2--- >>> arr--- Array D Seq (Sz (3 :. 4))--- [ [ (0,0), (0,1), (0,2), (0,3) ]--- , [ (1,0), (1,1), (1,2), (1,3) ]--- , [ (2,0), (2,1), (2,2), (2,3) ]--- ]--- >>> sfilter (even . fst) arr--- Array DS Seq (Sz1 8)--- [ (0,0), (0,1), (0,2), (0,3), (2,0), (2,1), (2,2), (2,3) ]------ @since 0.5.0-sfilter :: S.Stream r ix e => (e -> Bool) -> Array r ix e -> Vector DS e-sfilter f = DSArray . S.filter f . S.toStream-{-# INLINE sfilter #-}----- | Similar to `sfilter`, but map with an index aware function.------ @since 0.5.0-sifilter :: Stream r ix a => (ix -> a -> Bool) -> Array r ix a -> Vector DS a-sifilter f =- simapMaybe $ \ix e ->- if f ix e- then Just e- else Nothing-{-# INLINE sifilter #-}----- | Sequentially filter out elements from the array according to the supplied applicative predicate.------ ==== __Example__------ >>> import Data.Massiv.Array as A--- >>> arr = makeArrayR D Seq (Sz2 3 4) fromIx2--- >>> arr--- Array D Seq (Sz (3 :. 4))--- [ [ (0,0), (0,1), (0,2), (0,3) ]--- , [ (1,0), (1,1), (1,2), (1,3) ]--- , [ (2,0), (2,1), (2,2), (2,3) ]--- ]--- >>> sfilterM (Just . odd . fst) arr--- Just (Array DS Seq (Sz1 4)--- [ (1,0), (1,1), (1,2), (1,3) ]--- )--- >>> sfilterM (\ix@(_, j) -> print ix >> return (even j)) arr--- (0,0)--- (0,1)--- (0,2)--- (0,3)--- (1,0)--- (1,1)--- (1,2)--- (1,3)--- (2,0)--- (2,1)--- (2,2)--- (2,3)--- Array DS Seq (Sz1 6)--- [ (0,0), (0,2), (1,0), (1,2), (2,0), (2,2) ]------ @since 0.5.0-sfilterM :: (S.Stream r ix e, Applicative f) => (e -> f Bool) -> Array r ix e -> f (Vector DS e)-sfilterM f arr = DSArray <$> S.filterA f (S.toStream arr)-{-# INLINE sfilterM #-}----- | Similar to `filterM`, but map with an index aware function.------ @since 0.5.0-sifilterM ::- (Stream r ix a, Applicative f) => (ix -> a -> f Bool) -> Array r ix a -> f (Vector DS a)-sifilterM f =- simapMaybeM $ \ix e ->- (\p ->- if p- then Just e- else Nothing) <$>- f ix e-{-# INLINE sifilterM #-}----- | Apply a function to each element of the array, while discarding `Nothing` and--- keeping the `Maybe` result.------ @since 0.5.0-smapMaybe :: S.Stream r ix a => (a -> Maybe b) -> Array r ix a -> Vector DS b-smapMaybe f = DSArray . S.mapMaybe f . S.toStream-{-# INLINE smapMaybe #-}----- | Similar to `smapMaybe`, but map with an index aware function.------ @since 0.5.0-simapMaybe :: Stream r ix a => (ix -> a -> Maybe b) -> Array r ix a -> Vector DS b-simapMaybe f = DSArray . S.mapMaybe (uncurry f) . toStreamIx-{-# INLINE simapMaybe #-}---- | Similar to `smapMaybeM`, but map with an index aware function.------ @since 0.5.0-simapMaybeM ::- (Stream r ix a, Applicative f) => (ix -> a -> f (Maybe b)) -> Array r ix a -> f (Vector DS b)-simapMaybeM f = fmap DSArray . S.mapMaybeA (uncurry f) . toStreamIx-{-# INLINE simapMaybeM #-}----- | Keep all `Maybe`s and discard the `Nothing`s.------ @since 0.5.0-scatMaybes :: S.Stream r ix (Maybe a) => Array r ix (Maybe a) -> Vector DS a-scatMaybes = smapMaybe id-{-# INLINE scatMaybes #-}----- | Similar to `smapMaybe`, but with the use of `Applicative`------ @since 0.5.0-smapMaybeM ::- (S.Stream r ix a, Applicative f) => (a -> f (Maybe b)) -> Array r ix a -> f (Vector DS b)-smapMaybeM f = fmap DSArray . S.mapMaybeA f . S.toStream-{-# INLINE smapMaybeM #-}------ | Map a function over a stream vector------ @since 0.5.0-smap :: S.Stream r ix a => (a -> b) -> Array r ix a -> Vector DS b-smap f = fromSteps . S.map f . S.toStream-{-# INLINE smap #-}---- | Map an index aware function over a stream vector------ @since 0.5.0-simap :: S.Stream r ix a => (ix -> a -> b) -> Array r ix a -> Vector DS b-simap f = fromSteps . S.map (uncurry f) . S.toStreamIx-{-# INLINE simap #-}----- | Traverse a stream vector with an applicative function.------ @since 0.5.0-straverse :: (S.Stream r ix a, Applicative f) => (a -> f b) -> Array r ix a -> f (Vector DS b)-straverse f = fmap fromSteps . S.traverse f . S.toStream-{-# INLINE straverse #-}----- | Traverse a stream vector with an index aware applicative function.------ @since 0.5.0-sitraverse :: (S.Stream r ix a, Applicative f) => (ix -> a -> f b) -> Array r ix a -> f (Vector DS b)-sitraverse f = fmap fromSteps . S.traverse (uncurry f) . S.toStreamIx-{-# INLINE sitraverse #-}----- | Traverse a stream vector with a monadic function.------ @since 0.5.0-smapM :: (S.Stream r ix a, Monad m) => (a -> m b) -> Array r ix a -> m (Vector DS b)-smapM f = fromStepsM . S.mapM f . S.transStepsId . S.toStream-{-# INLINE smapM #-}---- | Traverse a stream vector with a monadic index aware function.------ @since 0.5.0-simapM :: (S.Stream r ix a, Monad m) => (ix -> a -> m b) -> Array r ix a -> m (Vector DS b)-simapM f = fromStepsM . S.mapM (uncurry f) . S.transStepsId . S.toStreamIx-{-# INLINE simapM #-}---- | Traverse a stream vector with a monadic function, while discarding the result------ @since 0.5.0-smapM_ :: (S.Stream r ix a, Monad m) => (a -> m b) -> Array r ix a -> m ()-smapM_ f = S.mapM_ f . S.transStepsId . S.toStream-{-# INLINE smapM_ #-}---- | Traverse a stream vector with a monadic index aware function, while discarding the result------ @since 0.5.0-simapM_ :: (S.Stream r ix a, Monad m) => (ix -> a -> m b) -> Array r ix a -> m ()-simapM_ f = S.mapM_ (uncurry f) . S.transStepsId . S.toStreamIx-{-# INLINE simapM_ #-}----- | Same as `smapM`, but with arguments flipped.------ @since 0.5.0-sforM :: (S.Stream r ix a, Monad m) => Array r ix a -> (a -> m b) -> m (Vector DS b)-sforM = flip smapM-{-# INLINE sforM #-}---- | Same as `simapM`, but with arguments flipped.------ @since 0.5.0-siforM :: (S.Stream r ix a, Monad m) => Array r ix a -> (ix -> a -> m b) -> m (Vector DS b)-siforM = flip simapM-{-# INLINE siforM #-}---- | Same as `smapM_`, but with arguments flipped.------ @since 0.5.0-sforM_ :: (S.Stream r ix a, Monad m) => Array r ix a -> (a -> m b) -> m ()-sforM_ = flip smapM_-{-# INLINE sforM_ #-}---- | Same as `simapM_`, but with arguments flipped.------ @since 0.5.0-siforM_ :: (S.Stream r ix a, Monad m) => Array r ix a -> (ix -> a -> m b) -> m ()-siforM_ = flip simapM_-{-# INLINE siforM_ #-}------ |------ @since 0.5.0-szip ::- (S.Stream ra ixa a, S.Stream rb ixb b) => Array ra ixa a -> Array rb ixb b -> Vector DS (a, b)-szip = szipWith (,)-{-# INLINE szip #-}---- |------ @since 0.5.0-szip3 ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c)- => Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Vector DS (a, b, c)-szip3 = szipWith3 (,,)-{-# INLINE szip3 #-}---- |------ @since 0.5.0-szip4 ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c, S.Stream rd ixd d)- => Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Vector DS (a, b, c, d)-szip4 = szipWith4 (,,,)-{-# INLINE szip4 #-}---- |------ @since 0.5.0-szip5 ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c, S.Stream rd ixd d, S.Stream re ixe e)- => Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Array re ixe e- -> Vector DS (a, b, c, d, e)-szip5 = szipWith5 (,,,,)-{-# INLINE szip5 #-}---- |------ @since 0.5.0-szip6 ::- ( S.Stream ra ixa a- , S.Stream rb ixb b- , S.Stream rc ixc c- , S.Stream rd ixd d- , S.Stream re ixe e- , S.Stream rf ixf f- )- => Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Array re ixe e- -> Array rf ixf f- -> Vector DS (a, b, c, d, e, f)-szip6 = szipWith6 (,,,,,)-{-# INLINE szip6 #-}--------- |------ @since 0.5.0-szipWith ::- (S.Stream ra ixa a, S.Stream rb ixb b)- => (a -> b -> c)- -> Array ra ixa a- -> Array rb ixb b- -> Vector DS c-szipWith f v1 v2 = fromSteps $ S.zipWith f (S.toStream v1) (S.toStream v2)-{-# INLINE szipWith #-}---- |------ @since 0.5.0-szipWith3 ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c)- => (a -> b -> c -> d)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Vector DS d-szipWith3 f v1 v2 v3 = fromSteps $ S.zipWith3 f (S.toStream v1) (S.toStream v2) (S.toStream v3)-{-# INLINE szipWith3 #-}---- |------ @since 0.5.0-szipWith4 ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c, S.Stream rd ixd d)- => (a -> b -> c -> d -> e)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Vector DS e-szipWith4 f v1 v2 v3 v4 =- fromSteps $ S.zipWith4 f (S.toStream v1) (S.toStream v2) (S.toStream v3) (S.toStream v4)-{-# INLINE szipWith4 #-}---- |------ @since 0.5.0-szipWith5 ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c, S.Stream rd ixd d, S.Stream re ixe e)- => (a -> b -> c -> d -> e -> f)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Array re ixe e- -> Vector DS f-szipWith5 f v1 v2 v3 v4 v5 =- fromSteps $- S.zipWith5 f (S.toStream v1) (S.toStream v2) (S.toStream v3) (S.toStream v4) (S.toStream v5)-{-# INLINE szipWith5 #-}---- |------ @since 0.5.0-szipWith6 ::- ( S.Stream ra ixa a- , S.Stream rb ixb b- , S.Stream rc ixc c- , S.Stream rd ixd d- , S.Stream re ixe e- , S.Stream rf ixf f- )- => (a -> b -> c -> d -> e -> f -> g)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Array re ixe e- -> Array rf ixf f- -> Vector DS g-szipWith6 f v1 v2 v3 v4 v5 v6 =- fromSteps $- S.zipWith6- f- (S.toStream v1)- (S.toStream v2)- (S.toStream v3)- (S.toStream v4)- (S.toStream v5)- (S.toStream v6)-{-# INLINE szipWith6 #-}---- |------ @since 0.5.0-sizipWith ::- (S.Stream ra ix a, S.Stream rb ix b)- => (ix -> a -> b -> c)- -> Array ra ix a- -> Array rb ix b- -> Vector DS c-sizipWith f v1 v2 = fromSteps $ S.zipWith (uncurry f) (S.toStreamIx v1) (S.toStream v2)-{-# INLINE sizipWith #-}---- |------ @since 0.5.0-sizipWith3 ::- (S.Stream ra ix a, S.Stream rb ix b, S.Stream rc ix c)- => (ix -> a -> b -> c -> d)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Vector DS d-sizipWith3 f v1 v2 v3 =- fromSteps $ S.zipWith3 (uncurry f) (S.toStreamIx v1) (S.toStream v2) (S.toStream v3)-{-# INLINE sizipWith3 #-}---- |------ @since 0.5.0-sizipWith4 ::- (S.Stream ra ix a, S.Stream rb ix b, S.Stream rc ix c, S.Stream rd ix d)- => (ix -> a -> b -> c -> d -> e)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Array rd ix d- -> Vector DS e-sizipWith4 f v1 v2 v3 v4 =- fromSteps $- S.zipWith4 (uncurry f) (S.toStreamIx v1) (S.toStream v2) (S.toStream v3) (S.toStream v4)-{-# INLINE sizipWith4 #-}---- |------ @since 0.5.0-sizipWith5 ::- (S.Stream ra ix a, S.Stream rb ix b, S.Stream rc ix c, S.Stream rd ix d, S.Stream re ix e)- => (ix -> a -> b -> c -> d -> e -> f)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Array rd ix d- -> Array re ix e- -> Vector DS f-sizipWith5 f v1 v2 v3 v4 v5 =- fromSteps $- S.zipWith5- (uncurry f)- (S.toStreamIx v1)- (S.toStream v2)- (S.toStream v3)- (S.toStream v4)- (S.toStream v5)-{-# INLINE sizipWith5 #-}---- |------ @since 0.5.0-sizipWith6 ::- ( S.Stream ra ix a- , S.Stream rb ix b- , S.Stream rc ix c- , S.Stream rd ix d- , S.Stream re ix e- , S.Stream rf ix f- )- => (ix -> a -> b -> c -> d -> e -> f -> g)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Array rd ix d- -> Array re ix e- -> Array rf ix f- -> Vector DS g-sizipWith6 f v1 v2 v3 v4 v5 v6 =- fromSteps $- S.zipWith6- (uncurry f)- (S.toStreamIx v1)- (S.toStream v2)- (S.toStream v3)- (S.toStream v4)- (S.toStream v5)- (S.toStream v6)-{-# INLINE sizipWith6 #-}----- |------ @since 0.5.0-szipWithM ::- (S.Stream ra ixa a, S.Stream rb ixb b, Monad m)- => (a -> b -> m c)- -> Array ra ixa a- -> Array rb ixb b- -> m (Vector DS c)-szipWithM f v1 v2 = fromStepsM $ S.zipWithM f (toStreamM v1) (toStreamM v2)-{-# INLINE szipWithM #-}---- |------ @since 0.5.0-szipWith3M ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c, Monad m)- => (a -> b -> c -> m d)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> m (Vector DS d)-szipWith3M f v1 v2 v3 = fromStepsM $ S.zipWith3M f (toStreamM v1) (toStreamM v2) (toStreamM v3)-{-# INLINE szipWith3M #-}---- |------ @since 0.5.0-szipWith4M ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c, S.Stream rd ixd d, Monad m)- => (a -> b -> c -> d -> m e)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> m (Vector DS e)-szipWith4M f v1 v2 v3 v4 =- fromStepsM $ S.zipWith4M f (toStreamM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4)-{-# INLINE szipWith4M #-}---- |------ @since 0.5.0-szipWith5M ::- ( S.Stream ra ixa a- , S.Stream rb ixb b- , S.Stream rc ixc c- , S.Stream rd ixd d- , S.Stream re ixe e- , Monad m- )- => (a -> b -> c -> d -> e -> m f)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Array re ixe e- -> m (Vector DS f)-szipWith5M f v1 v2 v3 v4 v5 =- fromStepsM $- S.zipWith5M f (toStreamM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4) (toStreamM v5)-{-# INLINE szipWith5M #-}---- |------ @since 0.5.0-szipWith6M ::- ( S.Stream ra ixa a- , S.Stream rb ixb b- , S.Stream rc ixc c- , S.Stream rd ixd d- , S.Stream re ixe e- , S.Stream rf ixf f- , Monad m- )- => (a -> b -> c -> d -> e -> f -> m g)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Array re ixe e- -> Array rf ixf f- -> m (Vector DS g)-szipWith6M f v1 v2 v3 v4 v5 v6 =- fromStepsM $- S.zipWith6M- f- (toStreamM v1)- (toStreamM v2)- (toStreamM v3)- (toStreamM v4)- (toStreamM v5)- (toStreamM v6)-{-# INLINE szipWith6M #-}----- |------ @since 0.5.0-sizipWithM ::- (S.Stream ra ix a, S.Stream rb ix b, Monad m)- => (ix -> a -> b -> m c)- -> Array ra ix a- -> Array rb ix b- -> m (Vector DS c)-sizipWithM f v1 v2 = fromStepsM $ S.zipWithM (uncurry f) (toStreamIxM v1) (toStreamM v2)-{-# INLINE sizipWithM #-}----- |------ @since 0.5.0-sizipWith3M ::- (S.Stream ra ix a, S.Stream rb ix b, S.Stream rc ix c, Monad m)- => (ix -> a -> b -> c -> m d)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> m (Vector DS d)-sizipWith3M f v1 v2 v3 =- fromStepsM $ S.zipWith3M (uncurry f) (toStreamIxM v1) (toStreamM v2) (toStreamM v3)-{-# INLINE sizipWith3M #-}---- |------ @since 0.5.0-sizipWith4M ::- (S.Stream ra ix a, S.Stream rb ix b, S.Stream rc ix c, S.Stream rd ix d, Monad m)- => (ix -> a -> b -> c -> d -> m e)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Array rd ix d- -> m (Vector DS e)-sizipWith4M f v1 v2 v3 v4 =- fromStepsM $- S.zipWith4M (uncurry f) (toStreamIxM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4)-{-# INLINE sizipWith4M #-}---- |------ @since 0.5.0-sizipWith5M ::- ( S.Stream ra ix a- , S.Stream rb ix b- , S.Stream rc ix c- , S.Stream rd ix d- , S.Stream re ix e- , Monad m- )- => (ix -> a -> b -> c -> d -> e -> m f)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Array rd ix d- -> Array re ix e- -> m (Vector DS f)-sizipWith5M f v1 v2 v3 v4 v5 =- fromStepsM $- S.zipWith5M- (uncurry f)- (toStreamIxM v1)- (toStreamM v2)- (toStreamM v3)- (toStreamM v4)- (toStreamM v5)-{-# INLINE sizipWith5M #-}---- |------ @since 0.5.0-sizipWith6M ::- ( S.Stream ra ix a- , S.Stream rb ix b- , S.Stream rc ix c- , S.Stream rd ix d- , S.Stream re ix e- , S.Stream rf ix f- , Monad m- )- => (ix -> a -> b -> c -> d -> e -> f -> m g)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Array rd ix d- -> Array re ix e- -> Array rf ix f- -> m (Vector DS g)-sizipWith6M f v1 v2 v3 v4 v5 v6 =- fromStepsM $- S.zipWith6M- (uncurry f)- (toStreamIxM v1)- (toStreamM v2)- (toStreamM v3)- (toStreamM v4)- (toStreamM v5)- (toStreamM v6)-{-# INLINE sizipWith6M #-}----- |------ @since 0.5.0-szipWithM_ ::- (S.Stream ra ixa a, S.Stream rb ixb b, Monad m)- => (a -> b -> m c)- -> Array ra ixa a- -> Array rb ixb b- -> m ()-szipWithM_ f v1 v2 = S.zipWithM_ f (toStreamM v1) (toStreamM v2)-{-# INLINE szipWithM_ #-}---- |------ @since 0.5.0-szipWith3M_ ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c, Monad m)- => (a -> b -> c -> m d)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> m ()-szipWith3M_ f v1 v2 v3 = S.zipWith3M_ f (toStreamM v1) (toStreamM v2) (toStreamM v3)-{-# INLINE szipWith3M_ #-}---- |------ @since 0.5.0-szipWith4M_ ::- (S.Stream ra ixa a, S.Stream rb ixb b, S.Stream rc ixc c, S.Stream rd ixd d, Monad m)- => (a -> b -> c -> d -> m e)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> m ()-szipWith4M_ f v1 v2 v3 v4 =- S.zipWith4M_ f (toStreamM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4)-{-# INLINE szipWith4M_ #-}---- |------ @since 0.5.0-szipWith5M_ ::- ( S.Stream ra ixa a- , S.Stream rb ixb b- , S.Stream rc ixc c- , S.Stream rd ixd d- , S.Stream re ixe e- , Monad m- )- => (a -> b -> c -> d -> e -> m f)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Array re ixe e- -> m ()-szipWith5M_ f v1 v2 v3 v4 v5 =- S.zipWith5M_ f (toStreamM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4) (toStreamM v5)-{-# INLINE szipWith5M_ #-}---- |------ @since 0.5.0-szipWith6M_ ::- ( S.Stream ra ixa a- , S.Stream rb ixb b- , S.Stream rc ixc c- , S.Stream rd ixd d- , S.Stream re ixe e- , S.Stream rf ixf f- , Monad m- )- => (a -> b -> c -> d -> e -> f -> m g)- -> Array ra ixa a- -> Array rb ixb b- -> Array rc ixc c- -> Array rd ixd d- -> Array re ixe e- -> Array rf ixf f- -> m ()-szipWith6M_ f v1 v2 v3 v4 v5 v6 =- S.zipWith6M_- f- (toStreamM v1)- (toStreamM v2)- (toStreamM v3)- (toStreamM v4)- (toStreamM v5)- (toStreamM v6)-{-# INLINE szipWith6M_ #-}------- |------ @since 0.5.0-sizipWithM_ ::- (S.Stream ra ix a, S.Stream rb ix b, Monad m)- => (ix -> a -> b -> m c)- -> Array ra ix a- -> Array rb ix b- -> m ()-sizipWithM_ f v1 v2 = S.zipWithM_ (uncurry f) (toStreamIxM v1) (toStreamM v2)-{-# INLINE sizipWithM_ #-}----- |------ @since 0.5.0-sizipWith3M_ ::- (S.Stream ra ix a, S.Stream rb ix b, S.Stream rc ix c, Monad m)- => (ix -> a -> b -> c -> m d)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> m ()-sizipWith3M_ f v1 v2 v3 = S.zipWith3M_ (uncurry f) (toStreamIxM v1) (toStreamM v2) (toStreamM v3)-{-# INLINE sizipWith3M_ #-}---- |------ @since 0.5.0-sizipWith4M_ ::- (S.Stream ra ix a, S.Stream rb ix b, S.Stream rc ix c, S.Stream rd ix d, Monad m)- => (ix -> a -> b -> c -> d -> m e)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Array rd ix d- -> m ()-sizipWith4M_ f v1 v2 v3 v4 =- S.zipWith4M_ (uncurry f) (toStreamIxM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4)-{-# INLINE sizipWith4M_ #-}---- |------ @since 0.5.0-sizipWith5M_ ::- ( S.Stream ra ix a- , S.Stream rb ix b- , S.Stream rc ix c- , S.Stream rd ix d- , S.Stream re ix e- , Monad m- )- => (ix -> a -> b -> c -> d -> e -> m f)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Array rd ix d- -> Array re ix e- -> m ()-sizipWith5M_ f v1 v2 v3 v4 v5 =- S.zipWith5M_- (uncurry f)- (toStreamIxM v1)- (toStreamM v2)- (toStreamM v3)- (toStreamM v4)- (toStreamM v5)-{-# INLINE sizipWith5M_ #-}---- |------ @since 0.5.0-sizipWith6M_ ::- ( S.Stream ra ix a- , S.Stream rb ix b- , S.Stream rc ix c- , S.Stream rd ix d- , S.Stream re ix e- , S.Stream rf ix f- , Monad m- )- => (ix -> a -> b -> c -> d -> e -> f -> m g)- -> Array ra ix a- -> Array rb ix b- -> Array rc ix c- -> Array rd ix d- -> Array re ix e- -> Array rf ix f- -> m ()-sizipWith6M_ f v1 v2 v3 v4 v5 v6 =- S.zipWith6M_- (uncurry f)- (toStreamIxM v1)- (toStreamM v2)- (toStreamM v3)- (toStreamM v4)- (toStreamM v5)- (toStreamM v6)-{-# INLINE sizipWith6M_ #-}-------- |------ @since 0.5.0-sfoldl :: Stream r ix e => (a -> e -> a) -> a -> Array r ix e -> a-sfoldl f acc = S.unId . S.foldl f acc . toStream-{-# INLINE sfoldl #-}---- |------ @since 0.5.0-sfoldlM :: (Stream r ix e, Monad m) => (a -> e -> m a) -> a -> Array r ix e -> m a-sfoldlM f acc = S.foldlM f acc . S.transStepsId . toStream-{-# INLINE sfoldlM #-}---- |------ @since 0.5.0-sfoldlM_ :: (Stream r ix e, Monad m) => (a -> e -> m a) -> a -> Array r ix e -> m ()-sfoldlM_ f acc = void . sfoldlM f acc-{-# INLINE sfoldlM_ #-}----- |------ @since 0.5.0-sfoldl1' :: Stream r ix e => (e -> e -> e) -> Array r ix e -> e-sfoldl1' f = either throw id . sfoldl1M (\e -> pure . f e)-{-# INLINE sfoldl1' #-}---- |------ @since 0.5.0-sfoldl1M :: (Stream r ix e, MonadThrow m) => (e -> e -> m e) -> Array r ix e -> m e-sfoldl1M f arr = do- let str = S.transStepsId $ toStream arr- nullStream <- S.null str- when nullStream $ throwM $ SizeEmptyException (size arr)- S.foldl1M f str-{-# INLINE sfoldl1M #-}---- |------ @since 0.5.0-sfoldl1M_ :: (Stream r ix e, MonadThrow m) => (e -> e -> m e) -> Array r ix e -> m ()-sfoldl1M_ f = void . sfoldl1M f-{-# INLINE sfoldl1M_ #-}------ |------ @since 0.5.0-sifoldl :: Stream r ix e => (a -> ix -> e -> a) -> a -> Array r ix e -> a-sifoldl f acc = S.unId . S.foldl (\a (ix, e) -> f a ix e) acc . toStreamIx-{-# INLINE sifoldl #-}---- |------ @since 0.5.0-sifoldlM :: (Stream r ix e, Monad m) => (a -> ix -> e -> m a) -> a -> Array r ix e -> m a-sifoldlM f acc = S.foldlM (\a (ix, e) -> f a ix e) acc . S.transStepsId . toStreamIx-{-# INLINE sifoldlM #-}---- |------ @since 0.5.0-sifoldlM_ :: (Stream r ix e, Monad m) => (a -> ix -> e -> m a) -> a -> Array r ix e -> m ()-sifoldlM_ f acc = void . sifoldlM f acc-{-# INLINE sifoldlM_ #-}----- |------ @since 0.5.0-sor :: Stream r ix Bool => Array r ix Bool -> Bool-sor = S.unId . S.or . toStream-{-# INLINE sor #-}----- |------ @since 0.5.0-sand :: Stream r ix Bool => Array r ix Bool -> Bool-sand = S.unId . S.and . toStream-{-# INLINE sand #-}----- |------ @since 0.5.0-sany :: Stream r ix e => (e -> Bool) -> Array r ix e -> Bool-sany f = S.unId . S.or . S.map f . toStream-{-# INLINE sany #-}----- |------ @since 0.5.0-sall :: Stream r ix e => (e -> Bool) -> Array r ix e -> Bool-sall f = S.unId . S.and . S.map f . toStream-{-# INLINE sall #-}------ |------ @since 0.5.0-ssum :: (Num e, Stream r ix e) => Array r ix e -> e-ssum = sfoldl (+) 0-{-# INLINE ssum #-}---- |------ @since 0.5.0-sproduct :: (Num e, Stream r ix e) => Array r ix e -> e-sproduct = sfoldl (*) 1-{-# INLINE sproduct #-}----- |------ @since 0.5.0-smaximum' :: (Ord e, Stream r ix e) => Array r ix e -> e-smaximum' = sfoldl1' max-{-# INLINE smaximum' #-}---- |------ @since 0.5.0-smaximumM :: (Ord e, Stream r ix e, MonadThrow m) => Array r ix e -> m e-smaximumM = sfoldl1M (\e acc -> pure (max e acc))-{-# INLINE smaximumM #-}------ |------ @since 0.5.0-sminimum' :: (Ord e, Stream r ix e) => Array r ix e -> e-sminimum' = sfoldl1' min-{-# INLINE sminimum' #-}---- |+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}+-- |+-- Module : Data.Massiv.Vector+-- Copyright : (c) Alexey Kuleshevich 2020+-- License : BSD3+-- Maintainer : Alexey Kuleshevich <lehins@yandex.ru>+-- Stability : experimental+-- Portability : non-portable+--+module Data.Massiv.Vector+ ( Vector+ , MVector+ -- * Accessors+ -- *** Size+ , slength+ , maxSize+ , size+ , snull+ -- *** Indexing+ , (!?)+ , (!)+ , index+ , index'+ , head'+ , shead'+ , last'+ -- *** Monadic Indexing+ , indexM+ , headM+ , sheadM+ , lastM+ , unconsM+ , unsnocM+ -- ** Slicing+ , slice+ , slice'+ , sliceM+ , sslice+ , sliceAt+ , sliceAt'+ , sliceAtM+ -- *** Init+ , init+ , init'+ , initM+ -- *** Tail+ , tail+ , tail'+ , tailM+ -- *** Take+ , take+ , take'+ , takeM+ , stake+ -- *** Drop+ , drop+ , drop'+ , dropM+ , sdrop+ -- * Construction+ -- ** Initialization+ , empty+ , sempty+ , singleton+ , ssingleton+ , cons+ , snoc+ , A.replicate+ , sreplicate+ , generate+ , sgenerate+ -- , iterateN+ -- , iiterateN+ , siterateN+ -- ** Monadic initialization+ , sreplicateM+ , sgenerateM+ , siterateNM+ -- , create+ -- , createT+ -- ** Unfolding+ , sunfoldr+ , sunfoldrM+ , sunfoldrN+ , sunfoldrNM+ , sunfoldrExactN+ , sunfoldrExactNM+ -- , constructN+ -- , constructrN+ -- ** Enumeration+ , (...)+ , (..:)+ , enumFromN+ , senumFromN+ , enumFromStepN+ , senumFromStepN+ -- ** Concatenation+ -- , consS -- cons+ -- , snocS -- snoc+ , sappend -- (++)+ , sconcat -- concat+ -- -- ** Restricitng memory usage+ -- , force+ -- -- * Modifying+ -- -- ** Bulk updates+ -- , (//)+ -- , update_+ -- -- ** Accumulations+ -- , accum+ -- , accumulate_+ -- -- ** Permutations+ -- , reverse+ -- , backpermute+ -- -- ** Mutable updates+ -- , modify+ -- -- * Elementwise+ -- -- ** Mapping+ , smap+ , simap+ -- , sconcatMap+ -- ** Monadic mapping+ , straverse+ , sitraverse+ , smapM+ , smapM_+ , simapM+ , simapM_+ , sforM+ , sforM_+ , siforM+ , siforM_+ -- ** Zipping+ , szip+ , szip3+ , szip4+ , szip5+ , szip6+ , szipWith+ , szipWith3+ , szipWith4+ , szipWith5+ , szipWith6+ , sizipWith+ , sizipWith3+ , sizipWith4+ , sizipWith5+ , sizipWith6+ -- ** Monadic zipping+ , szipWithM+ , szipWith3M+ , szipWith4M+ , szipWith5M+ , szipWith6M+ , sizipWithM+ , sizipWith3M+ , sizipWith4M+ , sizipWith5M+ , sizipWith6M++ , szipWithM_+ , szipWith3M_+ , szipWith4M_+ , szipWith5M_+ , szipWith6M_+ , sizipWithM_+ , sizipWith3M_+ , sizipWith4M_+ , sizipWith5M_+ , sizipWith6M_+ -- * Predicates+ -- ** Filtering+ , sfilter+ , sifilter+ , sfilterM+ , sifilterM+ -- , uniq -- sunique?+ , smapMaybe+ , smapMaybeM+ , scatMaybes+ , simapMaybe+ , simapMaybeM+ -- , takeWhile+ -- , dropWhile+ -- -- ** Partitioning+ -- , partition+ -- , unstablePartition+ -- , partitionWith+ -- , span+ -- , break+ -- -- ** Searching+ -- , elem+ -- , notElem+ -- , find+ -- , findIndex+ -- , findIndices+ -- , elemIndex+ -- , elemIndices+ -- * Folding+ , sfoldl+ , sfoldlM+ , sfoldlM_+ , sifoldl+ , sifoldlM+ , sifoldlM_+ , sfoldl1'+ , sfoldl1M+ , sfoldl1M_+ -- ** Specialized folds+ , sor+ , sand+ , sall+ , sany+ , ssum+ , sproduct+ , smaximum'+ , smaximumM+ -- , maximumBy+ , sminimum'+ , sminimumM+ -- , minimumBy+ -- , minIndex+ -- , minIndexBy+ -- , maxIndex+ -- , maxIndexBy+ -- -- ** Prefix sums+ -- , prescanl+ -- , prescanl'+ -- , postscanl+ -- , postscanl'+ -- , scanl+ -- , scanl'+ -- , scanl1+ -- , scanl1'+ -- , prescanr+ -- , prescanr'+ -- , postscanr+ -- , postscanr'+ -- , scanr+ -- , scanr'+ -- , scanr1+ -- , scanr1'+ -- * Conversions+ -- ** Lists+ , stoList+ , fromList+ , sfromList+ , sfromListN+ -- * Computation+ , compute+ , computeS+ , computeIO+ , computePrimM+ , computeAs+ , computeProxy+ , computeSource+ , computeWithStride+ , computeWithStrideAs+ , clone+ , convert+ , convertAs+ , convertProxy+ -- -- ** Other vector types+ -- , convert+ -- -- ** Mutable vectors+ -- , freeze+ -- , thaw+ -- , copy+ -- , unsafeFreeze+ -- , unsafeThaw+ -- , unsafeCopy+ -- * Deprecated+ , takeS+ , dropS+ , unfoldr+ , unfoldrN+ , filterS+ , ifilterS+ , filterM+ , ifilterM+ , mapMaybeS+ , imapMaybeS+ , mapMaybeM+ , imapMaybeM+ , catMaybesS+ , traverseS+ -- ** Re-exports+ , module Data.Massiv.Core+ , module Data.Massiv.Array.Delayed+ , module Data.Massiv.Array.Manifest+ , module Data.Massiv.Array.Mutable+ ) where++import Control.Monad hiding (filterM, replicateM)+import Data.Coerce+import Data.Massiv.Array.Delayed+import Data.Massiv.Array.Delayed.Pull+import Data.Massiv.Array.Delayed.Push+import Data.Massiv.Array.Delayed.Stream+import Data.Massiv.Array.Manifest+import Data.Massiv.Array.Manifest.Internal+import Data.Massiv.Array.Manifest.List (fromList)+import Data.Massiv.Array.Mutable+import Data.Massiv.Array.Ops.Construct+import qualified Data.Massiv.Array.Ops.Construct as A (makeArrayR, replicate)+import Data.Massiv.Core+import Data.Massiv.Core.Common+import qualified Data.Massiv.Vector.Stream as S+import Data.Massiv.Vector.Unsafe+import Prelude hiding (drop, init, length, null, replicate, splitAt, tail, take)++-- ========= --+-- Accessors --+-- ========= --+++------------------------+-- Length information --+------------------------++-- | /O(1)/ - Get the length of a `Stream` array, but only if it is known exactly in+-- constant time without looking at any of the elements in the array.+--+-- /Related/: `maxSize`, `size`, `elemsCount` and `totalElem`+--+-- ==== __Examples__+--+-- >>> slength $ sfromList []+-- Nothing+-- >>> slength $ sreplicate 5 ()+-- Just (Sz1 5)+-- >>> slength $ makeArrayLinearR D Seq (Sz1 5) id+-- Just (Sz1 5)+-- >>> slength $ sunfoldr (\x -> Just (x, x)) (0 :: Int)+-- Nothing+-- >>> slength $ sunfoldrN 10 (\x -> Just (x, x)) (0 :: Int)+-- Nothing+-- >>> slength $ sunfoldrExactN 10 (\x -> (x, x)) (0 :: Int)+-- Just (Sz1 10)+--+-- /__Similar__/:+--+-- [@Data.Foldable.`Data.Foldable.length`@] For some data structures, like a list for+-- example, it is an /O(n)/ operation, because there is a need to evaluate the full spine+-- and possibly even the elements in order to get the full length. With `Stream` vectors+-- that is rarely the case.+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.length`@] In the vector package this+-- function will always break fusion, unless it is the only operation that is applied to+-- the vector.+--+-- @since 0.5.0+slength :: Stream r ix e => Array r ix e -> Maybe Sz1+slength v =+ case stepsSize (toStream v) of+ Exact sz -> Just (SafeSz sz)+ _ -> Nothing+{-# INLINE slength #-}++-- | /O(1)/ - Check whether a `Stream` array is empty or not. It only looks at the exact size+-- (i.e. `slength`), if it is available, otherwise checks if there is at least one element+-- in a stream.+--+-- /Related/: `isEmpty`, `isNotEmpty`+--+-- ==== __Examples__+--+-- >>> snull sempty+-- True+-- >>> snull (empty :: Array D Ix5 Int)+-- True+-- >>> snull $ ssingleton "A Vector with a single String element"+-- False+-- >>> snull $ sfromList []+-- True+-- >>> snull $ sfromList [1 :: Int ..]+-- False+--+-- /__Similar__/:+--+-- [@Data.Foldable.`Data.Foldable.null`@] List fusion is also broken with a check for+-- emptiness, unless there are no other consumers of the list.+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.null`@] Same as with+-- `Data.Vector.Generic.length`, unless it is the only operation applied to the vector it+-- will break fusion and will result in the vector being fully materialized in memory.+--+-- @since 0.5.0+snull :: Load r ix e => Array r ix e -> Bool+snull = isEmpty+{-# INLINE snull #-}++--------------+-- Indexing --+--------------+++-- | /O(1)/ - Get the first element of a `Source` vector. Throws an error on empty.+--+-- /Related/: `shead'`, `headM`, `sheadM`, `unconsM`.+--+-- ==== __Examples__+--+-- >>> head' (Ix1 10 ..: 10000000000000)+-- 10+-- >>> head' (Ix1 10 ..: 10)+-- *** Exception: SizeEmptyException: (Sz1 0) corresponds to an empty array+--+-- /__Similar__/:+--+-- [@Data.List.`Data.List.head`@] Also constant time and partial. Fusion is broken if+-- there other consumers of the list.+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.head`@] Also constant time and partial. Will+-- cause materialization of the full vector if any other function is applied to the vector.+--+-- @since 0.5.0+head' :: Source r Ix1 e => Vector r e -> e+head' = either throw id . headM+{-# INLINE head' #-}+++-- | /O(1)/ - Get the first element of a `Source` vector.+--+-- /Related/: `head'`, `shead'`, `sheadM`, `unconsM`.+--+-- /__Throws Exceptions__/: `SizeEmptyException`+--+-- ==== __Examples__+--+-- >>> headM (Ix1 10 ..: 10000000000000)+-- 10+-- >>> headM (Ix1 10 ..: 10000000000000) :: Maybe Int+-- Just 10+-- >>> headM (empty :: Array D Ix1 Int) :: Maybe Int+-- Nothing+-- >>> either show (const "") $ headM (Ix1 10 ..: 10)+-- "SizeEmptyException: (Sz1 0) corresponds to an empty array"+--+-- /__Similar__/:+--+-- [@Data.Maybe.`Data.Maybe.listToMaybe`@] It also a safe way to get the head of the list,+-- except it is restricted to `Maybe`+--+-- @since 0.5.0+headM :: (Source r Ix1 e, MonadThrow m) => Vector r e -> m e+headM v+ | isEmpty v = throwM $ SizeEmptyException (size v)+ | otherwise = pure $ unsafeLinearIndex v 0+{-# INLINE headM #-}+++-- | /O(1)/ - Get the first element of a `Stream` vector. Throws an error on empty.+--+-- /Related/: `head'`, `headM`, `sheadM`, `unconsM`.+--+-- ==== __Examples__+--+-- >>> shead' $ sunfoldr (\x -> Just (x, x)) (0 :: Int)+-- 0+-- >>> x = shead' $ sunfoldr (\_ -> Nothing) (0 :: Int)+-- >>> print x+-- *** Exception: SizeEmptyException: (Sz1 0) corresponds to an empty array+--+-- @since 0.5.0+shead' :: Stream r Ix1 e => Vector r e -> e+shead' = either throw id . sheadM+{-# INLINE shead' #-}++-- | /O(1)/ - Get the first element of a `Stream` vector.+--+-- /Related/: `head'`, `shead'`, `headM`, `unconsM`.+--+-- /__Throws Exceptions__/: `SizeEmptyException`+--+-- ==== __Examples__+--+-- >>> maybe 101 id $ sheadM (empty :: Vector D Int)+-- 101+-- >>> maybe 101 id $ sheadM (singleton 202 :: Vector D Int)+-- 202+-- >>> sheadM $ sunfoldr (\x -> Just (x, x)) (0 :: Int)+-- 0+-- >>> x <- sheadM $ sunfoldr (\_ -> Nothing) (0 :: Int)+-- *** Exception: SizeEmptyException: (Sz1 0) corresponds to an empty array+--+-- @since 0.5.0+sheadM :: (Stream r Ix1 e, MonadThrow m) => Vector r e -> m e+sheadM v =+ case S.unId (S.headMaybe (toStream v)) of+ Nothing -> throwM $ SizeEmptyException (size v)+ Just e -> pure e+{-# INLINE sheadM #-}+++-- | /O(1)/ - Take one element off of the `Source` vector from the left side, as well as+-- the remaining part of the vector in delayed `D` representation.+--+-- /Related/: `head'`, `shead'`, `headM`, `sheadM`, `cons`+--+-- /__Throws Exceptions__/: `SizeEmptyException`+--+-- ==== __Examples__+--+-- >>> unconsM (fromList Seq [1,2,3] :: Array P Ix1 Int)+-- (1,Array D Seq (Sz1 2)+-- [ 2, 3 ])+--+-- /__Similar__/:+--+-- [@Data.List.`Data.List.uncons`@] Same concept, except restricted to `Maybe` instead of+-- the more general `MonadThrow`+--+-- @since 0.3.0+unconsM :: (MonadThrow m, Source r Ix1 e) => Vector r e -> m (e, Vector D e)+unconsM arr+ | 0 == totalElem sz = throwM $ SizeEmptyException sz+ | otherwise =+ pure+ ( unsafeLinearIndex arr 0+ , makeArray (getComp arr) (SafeSz (unSz sz - 1)) (\ !i -> unsafeLinearIndex arr (i + 1)))+ where+ !sz = size arr+{-# INLINE unconsM #-}++-- | /O(1)/ - Take one element off of the vector from the right side, as well as the+-- remaining part of the vector.+--+-- /Related/: `last'`, `lastM`, `snoc`+--+-- /__Throws Exceptions__/: `SizeEmptyException`+--+-- ==== __Examples__+--+-- >>> unsnocM (fromList Seq [1,2,3] :: Array P Ix1 Int)+-- (Array D Seq (Sz1 2)+-- [ 1, 2 ],3)+--+-- @since 0.3.0+unsnocM :: (MonadThrow m, Source r Ix1 e) => Vector r e -> m (Vector D e, e)+unsnocM arr+ | k < 0 = throwM $ SizeEmptyException sz+ | otherwise =+ pure (makeArray (getComp arr) (SafeSz k) (unsafeLinearIndex arr), unsafeLinearIndex arr k)+ where+ !sz = size arr+ !k = unSz sz - 1+{-# INLINE unsnocM #-}+++-- | /O(1)/ - Get the last element of a `Source` vector. Throws an error on empty.+--+-- /Related/: `lastM`, `unsnocM`+--+-- ==== __Examples__+--+-- >>> last' (Ix1 10 ... 10000000000000)+-- 10000000000000+-- >>> last' (fromList Seq [] :: Array P Ix1 Int)+-- *** Exception: SizeEmptyException: (Sz1 0) corresponds to an empty array+--+-- /__Similar__/:+--+-- [@Data.List.`Data.List.last`@] Also partial, but it has /O(n)/ complixity. Fusion is+-- broken if there other consumers of the list.+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.last`@] Also constant time and partial. Will+-- cause materialization of the full vector if any other function is applied to the vector.+--+-- @since 0.5.0+last' :: Source r Ix1 e => Vector r e -> e+last' = either throw id . lastM+{-# INLINE last' #-}+++-- | /O(1)/ - Get the last element of a `Source` vector.+--+-- /Related/: `last'`, `unsnocM`+--+-- /__Throws Exceptions__/: `SizeEmptyException`+--+-- ==== __Examples__+--+-- >>> lastM (Ix1 10 ... 10000000000000)+-- 10000000000000+-- >>> lastM (Ix1 10 ... 10000000000000) :: Maybe Int+-- Just 10000000000000+-- >>> either show (const "") $ lastM (fromList Seq [] :: Array P Ix1 Int)+-- "SizeEmptyException: (Sz1 0) corresponds to an empty array"+--+-- @since 0.5.0+lastM :: (Source r Ix1 e, MonadThrow m) => Vector r e -> m e+lastM v+ | k == 0 = throwM $ SizeEmptyException (size v)+ | otherwise = pure $ unsafeLinearIndex v (k - 1)+ where k = unSz (size v)+{-# INLINE lastM #-}+++-- | /O(1)/ - Take a slice of a `Source` vector. Never fails, instead adjusts the indices.+--+-- ==== __Examples__+--+-- >>> slice 10 5 (Ix1 0 ... 10000000000000)+-- Array D Seq (Sz1 5)+-- [ 10, 11, 12, 13, 14 ]+-- >>> slice (-10) 5 (Ix1 0 ... 10000000000000)+-- Array D Seq (Sz1 5)+-- [ 0, 1, 2, 3, 4 ]+-- >>> slice 9999999999998 50 (Ix1 0 ... 10000000000000)+-- Array D Seq (Sz1 3)+-- [ 9999999999998, 9999999999999, 10000000000000 ]+--+-- @since 0.5.0+slice :: Source r Ix1 e => Ix1 -> Sz1 -> Vector r e -> Vector r e+slice !i (Sz k) v = unsafeLinearSlice i' newSz v+ where+ !i' = min n (max 0 i)+ !newSz = SafeSz (min (n - i') k)+ Sz n = size v+{-# INLINE slice #-}++-- | /O(1)/ - Take a slice of a `Source` vector. Throws an error on incorrect indices.+--+-- ==== __Examples__+--+-- >>> slice' 10 5 (Ix1 0 ... 100)+-- Array D Seq (Sz1 5)+-- [ 10, 11, 12, 13, 14 ]+-- >>> slice' (-10) 5 (Ix1 0 ... 100)+-- Array D *** Exception: SizeSubregionException: (Sz1 101) is to small for -10 (Sz1 5)+-- >>> slice' 98 50 (Ix1 0 ... 100)+-- Array D *** Exception: SizeSubregionException: (Sz1 101) is to small for 98 (Sz1 50)+-- >>> slice' 9999999999998 50 (Ix1 0 ... 10000000000000)+-- Array D *** Exception: SizeSubregionException: (Sz1 10000000000001) is to small for 9999999999998 (Sz1 50)+-- >>> slice' 9999999999998 3 (Ix1 0 ... 10000000000000)+-- Array D Seq (Sz1 3)+-- [ 9999999999998, 9999999999999, 10000000000000 ]+--+-- @since 0.5.0+slice' :: Source r Ix1 e => Ix1 -> Sz1 -> Vector r e -> Vector r e+slice' i k = either throw id . sliceM i k+{-# INLINE slice' #-}+++-- | /O(1)/ - Take a slice of a `Source` vector. Throws an error on incorrect indices.+--+-- /__Throws Exceptions__/: `SizeSubregionException`+--+-- ==== __Examples__+--+--+-- @since 0.5.0+sliceM :: (Source r Ix1 e, MonadThrow m) => Ix1 -> Sz1 -> Vector r e -> m (Vector r e)+sliceM i newSz@(Sz k) v+ | i >= 0 && k <= n - i = pure $ unsafeLinearSlice i newSz v+ | otherwise = throwM $ SizeSubregionException sz i newSz+ where+ sz@(Sz n) = size v+{-# INLINE sliceM #-}+++-- | Take a slice of a `Stream` vector. Never fails, instead adjusts the indices.+--+-- ==== __Examples__+--+-- >>> sslice 10 5 (Ix1 0 ... 10000000000000)+-- Array DS Seq (Sz1 5)+-- [ 10, 11, 12, 13, 14 ]+-- >>> sslice 10 5 (sfromList [0 :: Int .. ])+-- Array DS Seq (Sz1 5)+-- [ 10, 11, 12, 13, 14 ]+-- >>> sslice (-10) 5 (Ix1 0 ... 10000000000000)+-- Array DS Seq (Sz1 5)+-- [ 0, 1, 2, 3, 4 ]+--+-- Unlike `slice` it has to iterate through each element until the staring index is reached,+-- therefore something like @sslice 9999999999998 50 (Ix1 0 ... 10000000000000)@ will not+-- be feasable.+--+-- >>> import System.Timeout (timeout)+-- >>> let smallArr = sslice 9999999999998 50 (Ix1 0 ... 10000000000000)+-- >>> timeout 500000 (computeIO smallArr :: IO (Array P Ix1 Int))+-- Nothing+--+-- @since 0.5.0+sslice :: Stream r Ix1 e => Ix1 -> Sz1 -> Vector r e -> Vector DS e+sslice !i (Sz k) = fromSteps . S.slice i k . S.toStream+{-# INLINE sslice #-}+++-- | /O(1)/ - Get a vector without the last element. Never fails.+--+-- ==== __Examples__+--+-- >>> init (0 ..: 10)+-- Array D Seq (Sz1 9)+-- [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]+-- >>> init (empty :: Array D Ix1 Int)+-- Array D Seq (Sz1 0)+-- [ ]+--+-- @since 0.5.0+init :: Source r Ix1 e => Vector r e -> Vector r e+init v = unsafeLinearSlice 0 (Sz (coerce (size v) - 1)) v+{-# INLINE init #-}++-- | /O(1)/ - Get a vector without the last element. Throws an error on empty+--+-- ==== __Examples__+--+-- >>> init' (0 ..: 10)+-- Array D Seq (Sz1 9)+-- [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]+-- >>> init' (empty :: Array D Ix1 Int)+-- Array D *** Exception: SizeEmptyException: (Sz1 0) corresponds to an empty array+--+-- @since 0.5.0+init' :: Source r Ix1 e => Vector r e -> Vector r e+init' = either throw id . initM+{-# INLINE init' #-}++-- | /O(1)/ - Get a vector without the last element. Throws an error on empty+--+-- ==== __Examples__+--+-- >>> initM (0 ..: 10)+-- Array D Seq (Sz1 9)+-- [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]+-- >>> maybe 0 sum $ initM (0 ..: 10)+-- 36+-- >>> maybe 0 sum $ initM (empty :: Array D Ix1 Int)+-- 0+--+-- @since 0.5.0+initM :: (Source r Ix1 e, MonadThrow m) => Vector r e -> m (Vector r e)+initM v = do+ when (isEmpty v) $ throwM $ SizeEmptyException $ size v+ pure $ unsafeInit v+{-# INLINE initM #-}++++-- | /O(1)/ - Get a vector without the first element. Never fails+--+-- ==== __Examples__+--+-- >>> tail (0 ..: 10)+-- Array D Seq (Sz1 9)+-- [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]+-- >>> tail (empty :: Array D Ix1 Int)+-- Array D Seq (Sz1 0)+-- [ ]+--+-- @since 0.5.0+tail :: Source r Ix1 e => Vector r e -> Vector r e+tail = drop 1+{-# INLINE tail #-}+++-- | /O(1)/ - Get a vector without the first element. Throws an error on empty+--+-- ==== __Examples__+--+-- λ> tail' (0 ..: 10)+-- Array D Seq (Sz1 9)+-- [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]+-- λ> tail' (empty :: Array D Ix1 Int)+-- Array D *** Exception: SizeEmptyException: (Sz1 0) corresponds to an empty array+--+-- @since 0.5.0+tail' :: Source r Ix1 e => Vector r e -> Vector r e+tail' = either throw id . tailM+{-# INLINE tail' #-}+++-- | /O(1)/ - Get the vector without the first element. Throws an error on empty+--+-- ==== __Examples__+--+-- >>> tailM (0 ..: 10)+-- Array D Seq (Sz1 9)+-- [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]+-- >>> maybe 0 sum $ tailM (0 ..: 10)+-- 45+-- >>> maybe 0 sum $ tailM (empty :: Array D Ix1 Int)+-- 0+--+-- @since 0.5.0+tailM :: (Source r Ix1 e, MonadThrow m) => Vector r e -> m (Vector r e)+tailM v = do+ when (isEmpty v) $ throwM $ SizeEmptyException $ size v+ pure $ unsafeTail v+{-# INLINE tailM #-}++++-- | /O(1)/ - Get the vector with the first @n@ elements. Never fails+--+-- ==== __Examples__+--+-- >>> take 5 (0 ..: 10)+-- Array D Seq (Sz1 5)+-- [ 0, 1, 2, 3, 4 ]+-- >>> take (-5) (0 ..: 10)+-- Array D Seq (Sz1 0)+-- [ ]+-- >>> take 100 (0 ..: 10)+-- Array D Seq (Sz1 10)+-- [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]+-- >>>+--+-- @since 0.5.0+take :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e+take k = fst . sliceAt k+{-# INLINE take #-}++-- | /O(1)/ - Get the vector with the first @n@ elements. Throws an error size is less+-- than @n@.+--+-- ==== __Examples__+--+-- >>> take' 0 (0 ..: 0)+-- Array D Seq (Sz1 0)+-- [ ]+-- >>> take' 5 (0 ..: 10)+-- Array D Seq (Sz1 5)+-- [ 0, 1, 2, 3, 4 ]+-- >>> take' 15 (0 ..: 10)+-- Array D *** Exception: SizeSubregionException: (Sz1 10) is to small for 0 (Sz1 15)+--+-- @since 0.5.0+take' :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e+take' k = either throw id . takeM k+{-# INLINE take' #-}++-- | /O(1)/ - Get the vector with the first @n@ elements. Throws an error size is less than @n@+--+-- ==== __Examples__+--+-- >>> takeM 5 (0 ..: 10)+-- Array D Seq (Sz1 5)+-- [ 0, 1, 2, 3, 4 ]+-- >>> maybe 0 sum $ takeM 5 (0 ..: 10)+-- 10+-- >>> maybe (-1) sum $ takeM 15 (0 ..: 10)+-- -1+--+-- @since 0.5.0+takeM :: (Source r Ix1 e, MonadThrow m) => Sz1 -> Vector r e -> m (Vector r e)+takeM k v = do+ let sz = size v+ when (k > sz) $ throwM $ SizeSubregionException sz 0 k+ pure $ unsafeTake k v+{-# INLINE takeM #-}++-- | /O(1)/ - Get a `Stream` vector with the first @n@ elements. Never fails+--+-- ==== __Examples__+--+-- @since 0.5.0+stake :: Stream r Ix1 e => Sz1 -> Vector r e -> Vector DS e+stake n = fromSteps . S.take (unSz n) . S.toStream+{-# INLINE stake #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+drop :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e+drop k = snd . sliceAt k+{-# INLINE drop #-}++-- | Keep all but the first @n@ elements from the delayed stream vector.+--+-- ==== __Examples__+--+-- @since 0.5.0+sdrop :: Stream r Ix1 e => Sz1 -> Vector r e -> Vector DS e+sdrop n = fromSteps . S.drop (unSz n) . S.toStream+{-# INLINE sdrop #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+drop' :: Source r Ix1 e => Sz1 -> Vector r e -> Vector r e+drop' k = either throw id . dropM k+{-# INLINE drop' #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+dropM :: (Source r Ix1 e, MonadThrow m) => Sz1 -> Vector r e -> m (Vector r e)+dropM k@(Sz d) v = do+ let sz@(Sz n) = size v+ when (k > sz) $ throwM $ SizeSubregionException sz d (sz - k)+ pure $ unsafeLinearSlice d (SafeSz (n - d)) v+{-# INLINE dropM #-}+++-- | Samel as `sliceAt`, except it never fails.+--+--+-- ==== __Examples__+--+-- @since 0.5.0+sliceAt :: Source r Ix1 e => Sz1 -> Vector r e -> (Vector r e, Vector r e)+sliceAt (Sz k) v = (unsafeTake d v, unsafeDrop d v)+ where+ !n = coerce (size v)+ !d = SafeSz (min k n)+{-# INLINE sliceAt #-}++-- | Same as `Data.Massiv.Array.splitAt'`, except for a flat vector.+--+-- ==== __Examples__+--+-- @since 0.5.0+sliceAt' :: Source r Ix1 e => Sz1 -> Vector r e -> (Vector r e, Vector r e)+sliceAt' k = either throw id . sliceAtM k+{-# INLINE sliceAt' #-}++-- | Same as `Data.Massiv.Array.splitAtM`, except for a flat vector.+--+-- ==== __Examples__+--+-- @since 0.5.0+sliceAtM :: (Source r Ix1 e, MonadThrow m) => Sz1 -> Vector r e -> m (Vector r e, Vector r e)+sliceAtM k v = do+ l <- takeM k v+ pure (l, unsafeDrop k v)+{-# INLINE sliceAtM #-}+++-- | Create an empty delayed stream vector+--+-- ==== __Examples__+--+-- @since 0.5.0+sempty :: Vector DS e+sempty = DSArray S.empty+{-# INLINE sempty #-}++-- | Create a delayed stream vector with a single element+--+-- ==== __Examples__+--+-- @since 0.5.0+ssingleton :: e -> Vector DS e+ssingleton = DSArray . S.singleton+{-# INLINE ssingleton #-}++-- | /O(1)/ - Add an element to the vector from the left side+--+-- @since 0.3.0+cons :: e -> Vector DL e -> Vector DL e+cons e arr =+ arr+ { dlSize = SafeSz (1 + unSz (dlSize arr))+ , dlLoad =+ \scheduler startAt uWrite ->+ uWrite startAt e >> dlLoad arr scheduler (startAt + 1) uWrite+ }+{-# INLINE cons #-}+++-- | /O(1)/ - Add an element to the vector from the right side+--+-- @since 0.3.0+snoc :: Vector DL e -> e -> Vector DL e+snoc arr e =+ arr+ { dlSize = SafeSz (1 + k)+ , dlLoad =+ \scheduler startAt uWrite -> dlLoad arr scheduler startAt uWrite >> uWrite (k + startAt) e+ }+ where+ !k = unSz (size arr)+{-# INLINE snoc #-}++++-- | Replicate the same element @n@ times+--+-- ==== __Examples__+--+-- @since 0.5.0+sreplicate :: Sz1 -> e -> Vector DS e+sreplicate (Sz n) = DSArray . S.replicate n+{-# INLINE sreplicate #-}++-- | Create a delayed vector of length @n@ with a function that maps an index to an+-- element. Same as `makeLinearArray`+--+-- ==== __Examples__+--+-- @since 0.5.0+generate :: Comp -> Sz1 -> (Ix1 -> e) -> Vector D e+generate = makeArrayLinear+{-# INLINE generate #-}++-- | Create a delayed stream vector of length @n@ with a function that maps an index to an+-- element. Same as `makeLinearArray`+--+-- ==== __Examples__+--+-- @since 0.5.0+sgenerate :: Sz1 -> (Ix1 -> e) -> Vector DS e+sgenerate (Sz n) = DSArray . S.generate n+{-# INLINE sgenerate #-}+++-- | Create a delayed stream vector of length @n@ by repeatedly apply a function to the+-- initial value.+--+-- ==== __Examples__+--+-- @since 0.5.0+siterateN :: Sz1 -> (e -> e) -> e -> Vector DS e+siterateN n f a = fromSteps $ S.iterateN (unSz n) f a+{-# INLINE siterateN #-}+++-- | Create a vector by using the same monadic action @n@ times+--+-- ==== __Examples__+--+-- @since 0.5.0+sreplicateM :: Monad m => Sz1 -> m e -> m (Vector DS e)+sreplicateM n f = fromStepsM $ S.replicateM (unSz n) f+{-# INLINE sreplicateM #-}+++-- | Create a delayed stream vector of length @n@ with a monadic action that from an index+-- generates an element.+--+-- ==== __Examples__+--+-- @since 0.5.0+sgenerateM :: Monad m => Sz1 -> (Ix1 -> m e) -> m (Vector DS e)+sgenerateM n f = fromStepsM $ S.generateM (unSz n) f+{-# INLINE sgenerateM #-}+++-- | Create a delayed stream vector of length @n@ by repeatedly apply a monadic action to+-- the initial value.+--+-- ==== __Examples__+--+-- @since 0.5.0+siterateNM :: Monad m => Sz1 -> (e -> m e) -> e -> m (Vector DS e)+siterateNM n f a = fromStepsM $ S.iterateNM (unSz n) f a+{-# INLINE siterateNM #-}+++++-- | Right unfolding function. Useful when it is unknown ahead of time how many+-- elements a vector will have.+--+-- ====__Example__+--+-- >>> import Data.Massiv.Array as A+-- >>> sunfoldr (\i -> if i < 9 then Just (i * i, i + 1) else Nothing) (0 :: Int)+-- Array DS Seq (Sz1 9)+-- [ 0, 1, 4, 9, 16, 25, 36, 49, 64 ]+--+-- @since 0.5.0+sunfoldr :: (s -> Maybe (e, s)) -> s -> Vector DS e+sunfoldr f = DSArray . S.unfoldr f+{-# INLINE sunfoldr #-}++++-- | /O(n)/ - Right unfolding function with at most @n@ number of elements.+--+-- ==== __Example__+--+-- >>> import Data.Massiv.Array as A+-- >>> sunfoldrN 9 (\i -> Just (i*i, i + 1)) (0 :: Int)+-- Array DS Seq (Sz1 9)+-- [ 0, 1, 4, 9, 16, 25, 36, 49, 64 ]+--+-- @since 0.5.0+sunfoldrN ::+ Sz1+ -- ^ @n@ - maximum number of elements that the vector will have+ -> (s -> Maybe (e, s))+ -- ^ Unfolding function. Stops when `Nothing` is returned or maximum number of elements+ -- is reached.+ -> s -- ^ Inititial element.+ -> Vector DS e+sunfoldrN (Sz n) f = DSArray . S.unfoldrN n f+{-# INLINE sunfoldrN #-}++-- | /O(n)/ - Same as `unfoldr`, but with monadic generating function.+--+-- ==== __Examples__+--+-- >>> import Control.Monad (when, guard)+-- >>> sunfoldrM (\i -> when (i == 0) (Left "Zero denominator") >> Right (guard (i < 5) >> Just (100 `div` i, i + 1))) (-10 :: Int)+-- Left "Zero denominator"+-- >>> sunfoldrM (\i -> when (i == 0) (Left "Zero denominator") >> Right (guard (i < -5) >> Just (100 `div` i, i + 1))) (-10 :: Int)+-- Right (Array DS Seq (Sz1 5)+-- [ -10, -12, -13, -15, -17 ]+-- )+--+-- @since 0.5.0+sunfoldrM :: Monad m => (s -> m (Maybe (e, s))) -> s -> m (Vector DS e)+sunfoldrM f = fromStepsM . S.unfoldrM f+{-# INLINE sunfoldrM #-}++-- | /O(n)/ - Same as `unfoldrN`, but with monadic generating function.+--+-- ==== __Examples__+--+-- >>> import Control.Monad (guard)+-- >>> sunfoldrNM 6 (\i -> print i >> pure (guard (i < 5) >> Just (i * i, i + 1))) (10 :: Int)+-- 10+-- Array DS Seq (Sz1 0)+-- [ ]+-- >>> sunfoldrNM 6 (\i -> print i >> pure (guard (i < 15) >> Just (i * i, i + 1))) (10 :: Int)+-- 10+-- 11+-- 12+-- 13+-- 14+-- 15+-- Array DS Seq (Sz1 5)+-- [ 100, 121, 144, 169, 196 ]+--+--+-- @since 0.5.0+sunfoldrNM :: Monad m => Sz1 -> (s -> m (Maybe (e, s))) -> s -> m (Vector DS e)+sunfoldrNM (Sz n) f = fromStepsM . S.unfoldrNM n f+{-# INLINE sunfoldrNM #-}+++-- | /O(n)/ - Similar to `unfoldrN`, except the length of the resulting vector will be exactly @n@+--+-- ==== __Examples__+--+-- >>> sunfoldrExactN 10 (\i -> (i * i, i + 1)) (10 :: Int)+-- Array DS Seq (Sz1 10)+-- [ 100, 121, 144, 169, 196, 225, 256, 289, 324, 361 ]+--+-- @since 0.5.0+sunfoldrExactN :: Sz1 -> (s -> (e, s)) -> s -> Vector DS e+sunfoldrExactN (Sz n) f = fromSteps . S.unfoldrExactN n f+{-# INLINE sunfoldrExactN #-}++-- | /O(n)/ - Similar to `unfoldrNM`, except the length of the resulting vector will be exactly @n@+--+-- ==== __Examples__+--+-- λ> sunfoldrExactNM 11 (\i -> pure (100 `div` i, i + 1)) (-10 :: Int)+-- Array DS *** Exception: divide by zero+-- λ> sunfoldrExactNM 11 (\i -> guard (i /= 0) >> Just (100 `div` i, i + 1)) (-10 :: Int)+-- Nothing+-- λ> sunfoldrExactNM 9 (\i -> guard (i /= 0) >> Just (100 `div` i, i + 1)) (-10 :: Int)+-- Just (Array DS Seq (Sz1 9)+-- [ -10, -12, -13, -15, -17, -20, -25, -34, -50 ]+-- )+--+-- @since 0.5.0+sunfoldrExactNM :: Monad m => Sz1 -> (s -> m (e, s)) -> s -> m (Vector DS e)+sunfoldrExactNM (Sz n) f = fromStepsM . S.unfoldrExactNM n f+{-# INLINE sunfoldrExactNM #-}+++-- | /O(n)/ - Enumerate from a starting number @x@ exactly @n@ times with a step @1@.+--+-- /Related/: `senumFromStepN`, `enumFromN`, `enumFromStepN`, `rangeSize`,+-- `rangeStepSize`, `range`, `rangeStep`+--+-- ==== __Examples__+--+-- >>> senumFromN (10 :: Int) 9+-- Array DS Seq (Sz1 9)+-- [ 10, 11, 12, 13, 14, 15, 16, 17, 18 ]+--+-- /__Similar__/:+--+-- [@Prelude.`Prelude.enumFromTo`@] Very similar to @[x .. x + n - 1]@, except that+-- `senumFromN` is faster and it only works for `Num` and not for `Enum` elements+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.enumFromN`@] Uses exactly the same+-- implementation underneath.+--+-- @since 0.5.0+senumFromN ::+ Num e+ => e -- ^ @x@ - starting number+ -> Sz1 -- ^ @n@ - length of resulting vector+ -> Vector DS e+senumFromN x (Sz n) = DSArray $ S.enumFromStepN x 1 n+{-# INLINE senumFromN #-}++-- | /O(n)/ - Enumerate from a starting number @x@ exactly @n@ times with a custom step value @dx@+--+-- ==== __Examples__+--+-- >>> senumFromStepN (5 :: Int) 2 10+-- Array DS Seq (Sz1 10)+-- [ 5, 7, 9, 11, 13, 15, 17, 19, 21, 23 ]+--+-- __/Similar/__:+--+-- [@Prelude.`Prelude.enumFrom`@] Just like @take n [x, x + dx ..]@, except that+-- `senumFromN` is faster and it only works for `Num` and not for `Enum` elements+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.enumFromStepN`@] Uses exactly the same+-- implementation underneath.+--+-- @since 0.5.0+senumFromStepN ::+ Num e+ => e -- ^ @x@ - starting number+ -> e -- ^ @dx@ - Step+ -> Sz1 -- ^ @n@ - length of resulting vector+ -> Vector DS e+senumFromStepN x step (Sz n) = DSArray $ S.enumFromStepN x step n+{-# INLINE senumFromStepN #-}++++-- | Append two vectors together+--+-- /Related/: `appendM`, `appendOuterM`,+--+-- ==== __Examples__+--+-- λ> sappend (1 ..: 6) (senumFromStepN 6 (-1) 6)+-- Array DS Seq (Sz1 11)+-- [ 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1 ]+--+-- __/Similar/__:+--+-- [@Data.Semigroup.`Data.Semigroup.<>`@] `DS` and `DL` arrays have instances for+-- `Semigroup`, so they will work in a similar fashion. `sappend` differs in that it accepts+-- `Stream` arrays with possibly different representations.+--+-- [@Data.List.`Data.List.++`@] Same operation, but for lists.+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.++`@] Uses exactly the same implementation+-- underneath as `sappend`, except that it cannot append two vectors with different+-- memory representations.+--+-- @since 0.5.0+sappend :: (Stream r1 Ix1 e, Stream r2 Ix1 e) => Vector r1 e -> Vector r2 e -> Vector DS e+sappend a1 a2 = fromSteps (toStream a1 `S.append` toStream a2)+{-# INLINE sappend #-}+++-- | Concat vectors together+--+-- /Related/: `concatM`, `concatOuterM`,+--+-- ==== __Examples__+--+-- >>> sconcat [2 ... 6, empty, singleton 1, generate Seq 5 id]+-- Array DS Seq (Sz1 11)+-- [ 2, 3, 4, 5, 6, 1, 0, 1, 2, 3, 4 ]+-- >>> sconcat [senumFromN 2 5, sempty, ssingleton 1, sgenerate 5 id]+-- Array DS Seq (Sz1 11)+-- [ 2, 3, 4, 5, 6, 1, 0, 1, 2, 3, 4 ]+--+-- __/Similar/__:+--+-- [@Data.Monoid.`Data.Monoid.mconcat`@] `DS` and `DL` arrays have instances for `Monoid`, so+-- they will work in a similar fashion. `sconcat` differs in that it accepts `Stream`+-- arrays of other representations.+--+-- [@Data.List.`Data.List.concat`@] Same operation, but for lists.+--+-- [@Data.Vector.Generic.`Data.Vector.Generic.concat`@] Uses exactly the same+-- implementation underneath as `sconcat`.+--+-- @since 0.5.0+sconcat :: Stream r Ix1 e => [Vector r e] -> Vector DS e+sconcat = DSArray . foldMap toStream+{-# INLINE sconcat #-}++-- | Convert a list to a delayed stream vector+--+-- /Related/: `fromList`, `fromListN`, `sfromListN`+--+-- ==== __Examples__+--+-- >>> sfromList ([] :: [Int])+-- Array DS Seq (Sz1 0)+-- [ ]+-- >>> sfromList ([1,2,3] :: [Int])+-- Array DS Seq (Sz1 3)+-- [ 1, 2, 3 ]+--+-- @since 0.5.0+sfromList :: [e] -> Vector DS e+sfromList = fromSteps . S.fromList+{-# INLINE sfromList #-}++-- | Convert a list to a delayed stream vector. Length of the resulting vector will be at+-- most @n@. This version isn't really more efficient then `sfromList`, but there is+-- `Data.Massiv.Array.Unsafe.unsafeFromListN`+--+-- /Related/: `fromList`, `fromListN`, `sfromList`+--+-- ==== __Examples__+--+-- >>> sfromListN 10 [1 :: Int ..]+-- Array DS Seq (Sz1 10)+-- [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]+-- >>> sfromListN 10 [1 :: Int .. 5]+-- Array DS Seq (Sz1 5)+-- [ 1, 2, 3, 4, 5 ]+--+-- @since 0.5.1+sfromListN :: Sz1 -> [e] -> Vector DS e+sfromListN (Sz n) = fromSteps . S.fromListN n+{-# INLINE sfromListN #-}++-- | Convert an array to a list by the means of a delayed stream vector.+--+-- /Related/: `toList`+--+-- ==== __Examples__+--+-- @since 0.5.0+stoList :: Stream r ix e => Array r ix e -> [e]+stoList = S.toList . toStream+{-# INLINE stoList #-}+++++++-- | Sequentially filter out elements from the array according to the supplied predicate.+--+-- ==== __Example__+--+-- >>> import Data.Massiv.Array as A+-- >>> arr = makeArrayR D Seq (Sz2 3 4) fromIx2+-- >>> arr+-- Array D Seq (Sz (3 :. 4))+-- [ [ (0,0), (0,1), (0,2), (0,3) ]+-- , [ (1,0), (1,1), (1,2), (1,3) ]+-- , [ (2,0), (2,1), (2,2), (2,3) ]+-- ]+-- >>> sfilter (even . fst) arr+-- Array DS Seq (Sz1 8)+-- [ (0,0), (0,1), (0,2), (0,3), (2,0), (2,1), (2,2), (2,3) ]+--+-- @since 0.5.0+sfilter :: S.Stream r ix e => (e -> Bool) -> Array r ix e -> Vector DS e+sfilter f = DSArray . S.filter f . S.toStream+{-# INLINE sfilter #-}+++-- | Similar to `sfilter`, but map with an index aware function.+--+-- ==== __Examples__+--+-- @since 0.5.0+sifilter :: Stream r ix a => (ix -> a -> Bool) -> Array r ix a -> Vector DS a+sifilter f =+ simapMaybe $ \ix e ->+ if f ix e+ then Just e+ else Nothing+{-# INLINE sifilter #-}+++-- | Sequentially filter out elements from the array according to the supplied applicative predicate.+--+-- ==== __Example__+--+-- >>> import Data.Massiv.Array as A+-- >>> arr = makeArrayR D Seq (Sz2 3 4) fromIx2+-- >>> arr+-- Array D Seq (Sz (3 :. 4))+-- [ [ (0,0), (0,1), (0,2), (0,3) ]+-- , [ (1,0), (1,1), (1,2), (1,3) ]+-- , [ (2,0), (2,1), (2,2), (2,3) ]+-- ]+-- >>> sfilterM (Just . odd . fst) arr+-- Just (Array DS Seq (Sz1 4)+-- [ (1,0), (1,1), (1,2), (1,3) ]+-- )+-- >>> sfilterM (\ix@(_, j) -> print ix >> return (even j)) arr+-- (0,0)+-- (0,1)+-- (0,2)+-- (0,3)+-- (1,0)+-- (1,1)+-- (1,2)+-- (1,3)+-- (2,0)+-- (2,1)+-- (2,2)+-- (2,3)+-- Array DS Seq (Sz1 6)+-- [ (0,0), (0,2), (1,0), (1,2), (2,0), (2,2) ]+--+-- @since 0.5.0+sfilterM :: (S.Stream r ix e, Applicative f) => (e -> f Bool) -> Array r ix e -> f (Vector DS e)+sfilterM f arr = DSArray <$> S.filterA f (S.toStream arr)+{-# INLINE sfilterM #-}+++-- | Similar to `filterM`, but map with an index aware function.+--+-- Corresponds to: @filterM (uncurry f) . imap (,)@+--+-- ==== __Examples__+--+-- @since 0.5.0+sifilterM ::+ (Stream r ix a, Applicative f) => (ix -> a -> f Bool) -> Array r ix a -> f (Vector DS a)+sifilterM f =+ simapMaybeM $ \ix e ->+ (\p ->+ if p+ then Just e+ else Nothing) <$>+ f ix e+{-# INLINE sifilterM #-}+++-- | Apply a function to each element of the array, while discarding `Nothing` and+-- keeping the `Maybe` result.+--+-- ==== __Examples__+--+-- @since 0.5.0+smapMaybe :: S.Stream r ix a => (a -> Maybe b) -> Array r ix a -> Vector DS b+smapMaybe f = DSArray . S.mapMaybe f . S.toStream+{-# INLINE smapMaybe #-}+++-- | Similar to `smapMaybe`, but map with an index aware function.+--+-- ==== __Examples__+--+-- @since 0.5.0+simapMaybe :: Stream r ix a => (ix -> a -> Maybe b) -> Array r ix a -> Vector DS b+simapMaybe f = DSArray . S.mapMaybe (uncurry f) . toStreamIx+{-# INLINE simapMaybe #-}++-- | Similar to `smapMaybeM`, but map with an index aware function.+--+-- ==== __Examples__+--+-- @since 0.5.0+simapMaybeM ::+ (Stream r ix a, Applicative f) => (ix -> a -> f (Maybe b)) -> Array r ix a -> f (Vector DS b)+simapMaybeM f = fmap DSArray . S.mapMaybeA (uncurry f) . toStreamIx+{-# INLINE simapMaybeM #-}+++-- | Keep all `Maybe`s and discard the `Nothing`s.+--+-- ==== __Examples__+--+-- @since 0.5.0+scatMaybes :: S.Stream r ix (Maybe a) => Array r ix (Maybe a) -> Vector DS a+scatMaybes = smapMaybe id+{-# INLINE scatMaybes #-}+++-- | Similar to `smapMaybe`, but with the `Applicative` function.+--+-- Similar to @mapMaybe id <$> mapM f arr@+--+-- ==== __Examples__+--+-- @since 0.5.0+smapMaybeM ::+ (S.Stream r ix a, Applicative f) => (a -> f (Maybe b)) -> Array r ix a -> f (Vector DS b)+smapMaybeM f = fmap DSArray . S.mapMaybeA f . S.toStream+{-# INLINE smapMaybeM #-}++++-- | Map a function over a stream vector+--+-- ==== __Examples__+--+-- @since 0.5.0+smap :: S.Stream r ix a => (a -> b) -> Array r ix a -> Vector DS b+smap f = fromSteps . S.map f . S.toStream+{-# INLINE smap #-}++-- | Map an index aware function over a stream vector+--+-- ==== __Examples__+--+-- @since 0.5.0+simap :: S.Stream r ix a => (ix -> a -> b) -> Array r ix a -> Vector DS b+simap f = fromSteps . S.map (uncurry f) . S.toStreamIx+{-# INLINE simap #-}+++-- | Traverse a stream vector with an applicative function.+--+-- ==== __Examples__+--+-- @since 0.5.0+straverse :: (S.Stream r ix a, Applicative f) => (a -> f b) -> Array r ix a -> f (Vector DS b)+straverse f = fmap fromSteps . S.traverse f . S.toStream+{-# INLINE straverse #-}+++-- | Traverse a stream vector with an index aware applicative function.+--+-- ==== __Examples__+--+-- @since 0.5.0+sitraverse :: (S.Stream r ix a, Applicative f) => (ix -> a -> f b) -> Array r ix a -> f (Vector DS b)+sitraverse f = fmap fromSteps . S.traverse (uncurry f) . S.toStreamIx+{-# INLINE sitraverse #-}+++-- | Traverse a stream vector with a monadic function.+--+-- ==== __Examples__+--+-- @since 0.5.0+smapM :: (S.Stream r ix a, Monad m) => (a -> m b) -> Array r ix a -> m (Vector DS b)+smapM f = fromStepsM . S.mapM f . S.transStepsId . S.toStream+{-# INLINE smapM #-}++-- | Traverse a stream vector with a monadic index aware function.+--+-- Corresponds to: @mapM (uncurry f) . imap (,) v@+--+-- ==== __Examples__+--+-- @since 0.5.0+simapM :: (S.Stream r ix a, Monad m) => (ix -> a -> m b) -> Array r ix a -> m (Vector DS b)+simapM f = fromStepsM . S.mapM (uncurry f) . S.transStepsId . S.toStreamIx+{-# INLINE simapM #-}++-- | Traverse a stream vector with a monadic function, while discarding the result+--+-- ==== __Examples__+--+-- @since 0.5.0+smapM_ :: (S.Stream r ix a, Monad m) => (a -> m b) -> Array r ix a -> m ()+smapM_ f = S.mapM_ f . S.transStepsId . S.toStream+{-# INLINE smapM_ #-}++-- | Traverse a stream vector with a monadic index aware function, while discarding the result+--+-- ==== __Examples__+--+-- @since 0.5.0+simapM_ :: (S.Stream r ix a, Monad m) => (ix -> a -> m b) -> Array r ix a -> m ()+simapM_ f = S.mapM_ (uncurry f) . S.transStepsId . S.toStreamIx+{-# INLINE simapM_ #-}+++-- | Same as `smapM`, but with arguments flipped.+--+-- ==== __Examples__+--+-- @since 0.5.0+sforM :: (S.Stream r ix a, Monad m) => Array r ix a -> (a -> m b) -> m (Vector DS b)+sforM = flip smapM+{-# INLINE sforM #-}++-- | Same as `simapM`, but with arguments flipped.+--+-- ==== __Examples__+--+-- @since 0.5.0+siforM :: (S.Stream r ix a, Monad m) => Array r ix a -> (ix -> a -> m b) -> m (Vector DS b)+siforM = flip simapM+{-# INLINE siforM #-}++-- | Same as `smapM_`, but with arguments flipped.+--+-- ==== __Examples__+--+-- @since 0.5.0+sforM_ :: (S.Stream r ix a, Monad m) => Array r ix a -> (a -> m b) -> m ()+sforM_ = flip smapM_+{-# INLINE sforM_ #-}++-- | Same as `simapM_`, but with arguments flipped.+--+-- ==== __Examples__+--+-- @since 0.5.0+siforM_ :: (S.Stream r ix a, Monad m) => Array r ix a -> (ix -> a -> m b) -> m ()+siforM_ = flip simapM_+{-# INLINE siforM_ #-}++++-- | Zip two arrays in a row-major order together together into a flat vector. Resulting+-- length of a vector will be the smallest number of elements of the supplied arrays.+--+-- ==== __Examples__+--+-- @since 0.5.0+szip ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b) => Vector ra a -> Vector rb b -> Vector DS (a, b)+szip = szipWith (,)+{-# INLINE szip #-}++-- |+--+-- @since 0.5.0+szip3 ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c)+ => Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector DS (a, b, c)+szip3 = szipWith3 (,,)+{-# INLINE szip3 #-}++-- |+--+-- @since 0.5.0+szip4 ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d)+ => Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector DS (a, b, c, d)+szip4 = szipWith4 (,,,)+{-# INLINE szip4 #-}++-- |+--+-- @since 0.5.0+szip5 ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d, S.Stream re Ix1 e)+ => Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector DS (a, b, c, d, e)+szip5 = szipWith5 (,,,,)+{-# INLINE szip5 #-}++-- |+--+-- @since 0.5.0+szip6 ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , S.Stream rf Ix1 f+ )+ => Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector rf f+ -> Vector DS (a, b, c, d, e, f)+szip6 = szipWith6 (,,,,,)+{-# INLINE szip6 #-}+++++++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+szipWith ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b)+ => (a -> b -> c)+ -> Vector ra a+ -> Vector rb b+ -> Vector DS c+szipWith f v1 v2 = fromSteps $ S.zipWith f (S.toStream v1) (S.toStream v2)+{-# INLINE szipWith #-}++-- |+--+-- @since 0.5.0+szipWith3 ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c)+ => (a -> b -> c -> d)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector DS d+szipWith3 f v1 v2 v3 = fromSteps $ S.zipWith3 f (S.toStream v1) (S.toStream v2) (S.toStream v3)+{-# INLINE szipWith3 #-}++-- |+--+-- @since 0.5.0+szipWith4 ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d)+ => (a -> b -> c -> d -> e)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector DS e+szipWith4 f v1 v2 v3 v4 =+ fromSteps $ S.zipWith4 f (S.toStream v1) (S.toStream v2) (S.toStream v3) (S.toStream v4)+{-# INLINE szipWith4 #-}++-- |+--+-- @since 0.5.0+szipWith5 ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d, S.Stream re Ix1 e)+ => (a -> b -> c -> d -> e -> f)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector DS f+szipWith5 f v1 v2 v3 v4 v5 =+ fromSteps $+ S.zipWith5 f (S.toStream v1) (S.toStream v2) (S.toStream v3) (S.toStream v4) (S.toStream v5)+{-# INLINE szipWith5 #-}++-- |+--+-- @since 0.5.0+szipWith6 ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , S.Stream rf Ix1 f+ )+ => (a -> b -> c -> d -> e -> f -> g)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector rf f+ -> Vector DS g+szipWith6 f v1 v2 v3 v4 v5 v6 =+ fromSteps $+ S.zipWith6+ f+ (S.toStream v1)+ (S.toStream v2)+ (S.toStream v3)+ (S.toStream v4)+ (S.toStream v5)+ (S.toStream v6)+{-# INLINE szipWith6 #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sizipWith ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b)+ => (Ix1 -> a -> b -> c)+ -> Vector ra a+ -> Vector rb b+ -> Vector DS c+sizipWith f v1 v2 = fromSteps $ S.zipWith (uncurry f) (S.toStreamIx v1) (S.toStream v2)+{-# INLINE sizipWith #-}++-- |+--+-- @since 0.5.0+sizipWith3 ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c)+ => (Ix1 -> a -> b -> c -> d)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector DS d+sizipWith3 f v1 v2 v3 =+ fromSteps $ S.zipWith3 (uncurry f) (S.toStreamIx v1) (S.toStream v2) (S.toStream v3)+{-# INLINE sizipWith3 #-}++-- |+--+-- @since 0.5.0+sizipWith4 ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d)+ => (Ix1 -> a -> b -> c -> d -> e)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector DS e+sizipWith4 f v1 v2 v3 v4 =+ fromSteps $+ S.zipWith4 (uncurry f) (S.toStreamIx v1) (S.toStream v2) (S.toStream v3) (S.toStream v4)+{-# INLINE sizipWith4 #-}++-- |+--+-- @since 0.5.0+sizipWith5 ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d, S.Stream re Ix1 e)+ => (Ix1 -> a -> b -> c -> d -> e -> f)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector DS f+sizipWith5 f v1 v2 v3 v4 v5 =+ fromSteps $+ S.zipWith5+ (uncurry f)+ (S.toStreamIx v1)+ (S.toStream v2)+ (S.toStream v3)+ (S.toStream v4)+ (S.toStream v5)+{-# INLINE sizipWith5 #-}++-- |+--+-- @since 0.5.0+sizipWith6 ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , S.Stream rf Ix1 f+ )+ => (Ix1 -> a -> b -> c -> d -> e -> f -> g)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector rf f+ -> Vector DS g+sizipWith6 f v1 v2 v3 v4 v5 v6 =+ fromSteps $+ S.zipWith6+ (uncurry f)+ (S.toStreamIx v1)+ (S.toStream v2)+ (S.toStream v3)+ (S.toStream v4)+ (S.toStream v5)+ (S.toStream v6)+{-# INLINE sizipWith6 #-}+++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+szipWithM ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, Monad m)+ => (a -> b -> m c)+ -> Vector ra a+ -> Vector rb b+ -> m (Vector DS c)+szipWithM f v1 v2 = fromStepsM $ S.zipWithM f (toStreamM v1) (toStreamM v2)+{-# INLINE szipWithM #-}++-- |+--+-- @since 0.5.0+szipWith3M ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, Monad m)+ => (a -> b -> c -> m d)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> m (Vector DS d)+szipWith3M f v1 v2 v3 = fromStepsM $ S.zipWith3M f (toStreamM v1) (toStreamM v2) (toStreamM v3)+{-# INLINE szipWith3M #-}++-- |+--+-- @since 0.5.0+szipWith4M ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d, Monad m)+ => (a -> b -> c -> d -> m e)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> m (Vector DS e)+szipWith4M f v1 v2 v3 v4 =+ fromStepsM $ S.zipWith4M f (toStreamM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4)+{-# INLINE szipWith4M #-}++-- |+--+-- @since 0.5.0+szipWith5M ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , Monad m+ )+ => (a -> b -> c -> d -> e -> m f)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> m (Vector DS f)+szipWith5M f v1 v2 v3 v4 v5 =+ fromStepsM $+ S.zipWith5M f (toStreamM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4) (toStreamM v5)+{-# INLINE szipWith5M #-}++-- |+--+-- @since 0.5.0+szipWith6M ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , S.Stream rf Ix1 f+ , Monad m+ )+ => (a -> b -> c -> d -> e -> f -> m g)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector rf f+ -> m (Vector DS g)+szipWith6M f v1 v2 v3 v4 v5 v6 =+ fromStepsM $+ S.zipWith6M+ f+ (toStreamM v1)+ (toStreamM v2)+ (toStreamM v3)+ (toStreamM v4)+ (toStreamM v5)+ (toStreamM v6)+{-# INLINE szipWith6M #-}+++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sizipWithM ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, Monad m)+ => (Ix1 -> a -> b -> m c)+ -> Vector ra a+ -> Vector rb b+ -> m (Vector DS c)+sizipWithM f v1 v2 = fromStepsM $ S.zipWithM (uncurry f) (toStreamIxM v1) (toStreamM v2)+{-# INLINE sizipWithM #-}+++-- |+--+-- @since 0.5.0+sizipWith3M ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, Monad m)+ => (Ix1 -> a -> b -> c -> m d)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> m (Vector DS d)+sizipWith3M f v1 v2 v3 =+ fromStepsM $ S.zipWith3M (uncurry f) (toStreamIxM v1) (toStreamM v2) (toStreamM v3)+{-# INLINE sizipWith3M #-}++-- |+--+-- @since 0.5.0+sizipWith4M ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d, Monad m)+ => (Ix1 -> a -> b -> c -> d -> m e)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> m (Vector DS e)+sizipWith4M f v1 v2 v3 v4 =+ fromStepsM $+ S.zipWith4M (uncurry f) (toStreamIxM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4)+{-# INLINE sizipWith4M #-}++-- |+--+-- @since 0.5.0+sizipWith5M ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , Monad m+ )+ => (Ix1 -> a -> b -> c -> d -> e -> m f)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> m (Vector DS f)+sizipWith5M f v1 v2 v3 v4 v5 =+ fromStepsM $+ S.zipWith5M+ (uncurry f)+ (toStreamIxM v1)+ (toStreamM v2)+ (toStreamM v3)+ (toStreamM v4)+ (toStreamM v5)+{-# INLINE sizipWith5M #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sizipWith6M ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , S.Stream rf Ix1 f+ , Monad m+ )+ => (Ix1 -> a -> b -> c -> d -> e -> f -> m g)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector rf f+ -> m (Vector DS g)+sizipWith6M f v1 v2 v3 v4 v5 v6 =+ fromStepsM $+ S.zipWith6M+ (uncurry f)+ (toStreamIxM v1)+ (toStreamM v2)+ (toStreamM v3)+ (toStreamM v4)+ (toStreamM v5)+ (toStreamM v6)+{-# INLINE sizipWith6M #-}+++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+szipWithM_ ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, Monad m)+ => (a -> b -> m c)+ -> Vector ra a+ -> Vector rb b+ -> m ()+szipWithM_ f v1 v2 = S.zipWithM_ f (toStreamM v1) (toStreamM v2)+{-# INLINE szipWithM_ #-}++-- |+--+-- @since 0.5.0+szipWith3M_ ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, Monad m)+ => (a -> b -> c -> m d)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> m ()+szipWith3M_ f v1 v2 v3 = S.zipWith3M_ f (toStreamM v1) (toStreamM v2) (toStreamM v3)+{-# INLINE szipWith3M_ #-}++-- |+--+-- @since 0.5.0+szipWith4M_ ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d, Monad m)+ => (a -> b -> c -> d -> m e)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> m ()+szipWith4M_ f v1 v2 v3 v4 =+ S.zipWith4M_ f (toStreamM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4)+{-# INLINE szipWith4M_ #-}++-- |+--+-- @since 0.5.0+szipWith5M_ ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , Monad m+ )+ => (a -> b -> c -> d -> e -> m f)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> m ()+szipWith5M_ f v1 v2 v3 v4 v5 =+ S.zipWith5M_ f (toStreamM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4) (toStreamM v5)+{-# INLINE szipWith5M_ #-}++-- |+--+-- @since 0.5.0+szipWith6M_ ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , S.Stream rf Ix1 f+ , Monad m+ )+ => (a -> b -> c -> d -> e -> f -> m g)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector rf f+ -> m ()+szipWith6M_ f v1 v2 v3 v4 v5 v6 =+ S.zipWith6M_+ f+ (toStreamM v1)+ (toStreamM v2)+ (toStreamM v3)+ (toStreamM v4)+ (toStreamM v5)+ (toStreamM v6)+{-# INLINE szipWith6M_ #-}+++++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sizipWithM_ ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, Monad m)+ => (Ix1 -> a -> b -> m c)+ -> Vector ra a+ -> Vector rb b+ -> m ()+sizipWithM_ f v1 v2 = S.zipWithM_ (uncurry f) (toStreamIxM v1) (toStreamM v2)+{-# INLINE sizipWithM_ #-}+++-- |+--+-- @since 0.5.0+sizipWith3M_ ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, Monad m)+ => (Ix1 -> a -> b -> c -> m d)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> m ()+sizipWith3M_ f v1 v2 v3 = S.zipWith3M_ (uncurry f) (toStreamIxM v1) (toStreamM v2) (toStreamM v3)+{-# INLINE sizipWith3M_ #-}++-- |+--+-- @since 0.5.0+sizipWith4M_ ::+ (S.Stream ra Ix1 a, S.Stream rb Ix1 b, S.Stream rc Ix1 c, S.Stream rd Ix1 d, Monad m)+ => (Ix1 -> a -> b -> c -> d -> m e)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> m ()+sizipWith4M_ f v1 v2 v3 v4 =+ S.zipWith4M_ (uncurry f) (toStreamIxM v1) (toStreamM v2) (toStreamM v3) (toStreamM v4)+{-# INLINE sizipWith4M_ #-}++-- |+--+-- @since 0.5.0+sizipWith5M_ ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , Monad m+ )+ => (Ix1 -> a -> b -> c -> d -> e -> m f)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> m ()+sizipWith5M_ f v1 v2 v3 v4 v5 =+ S.zipWith5M_+ (uncurry f)+ (toStreamIxM v1)+ (toStreamM v2)+ (toStreamM v3)+ (toStreamM v4)+ (toStreamM v5)+{-# INLINE sizipWith5M_ #-}++-- |+--+-- @since 0.5.0+sizipWith6M_ ::+ ( S.Stream ra Ix1 a+ , S.Stream rb Ix1 b+ , S.Stream rc Ix1 c+ , S.Stream rd Ix1 d+ , S.Stream re Ix1 e+ , S.Stream rf Ix1 f+ , Monad m+ )+ => (Ix1 -> a -> b -> c -> d -> e -> f -> m g)+ -> Vector ra a+ -> Vector rb b+ -> Vector rc c+ -> Vector rd d+ -> Vector re e+ -> Vector rf f+ -> m ()+sizipWith6M_ f v1 v2 v3 v4 v5 v6 =+ S.zipWith6M_+ (uncurry f)+ (toStreamIxM v1)+ (toStreamM v2)+ (toStreamM v3)+ (toStreamM v4)+ (toStreamM v5)+ (toStreamM v6)+{-# INLINE sizipWith6M_ #-}++++++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sfoldl :: Stream r ix e => (a -> e -> a) -> a -> Array r ix e -> a+sfoldl f acc = S.unId . S.foldl f acc . toStream+{-# INLINE sfoldl #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sfoldlM :: (Stream r ix e, Monad m) => (a -> e -> m a) -> a -> Array r ix e -> m a+sfoldlM f acc = S.foldlM f acc . S.transStepsId . toStream+{-# INLINE sfoldlM #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sfoldlM_ :: (Stream r ix e, Monad m) => (a -> e -> m a) -> a -> Array r ix e -> m ()+sfoldlM_ f acc = void . sfoldlM f acc+{-# INLINE sfoldlM_ #-}+++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sfoldl1' :: Stream r ix e => (e -> e -> e) -> Array r ix e -> e+sfoldl1' f = either throw id . sfoldl1M (\e -> pure . f e)+{-# INLINE sfoldl1' #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sfoldl1M :: (Stream r ix e, MonadThrow m) => (e -> e -> m e) -> Array r ix e -> m e+sfoldl1M f arr = do+ let str = S.transStepsId $ toStream arr+ nullStream <- S.null str+ when nullStream $ throwM $ SizeEmptyException (size arr)+ S.foldl1M f str+{-# INLINE sfoldl1M #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sfoldl1M_ :: (Stream r ix e, MonadThrow m) => (e -> e -> m e) -> Array r ix e -> m ()+sfoldl1M_ f = void . sfoldl1M f+{-# INLINE sfoldl1M_ #-}++++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sifoldl :: Stream r ix e => (a -> ix -> e -> a) -> a -> Array r ix e -> a+sifoldl f acc = S.unId . S.foldl (\a (ix, e) -> f a ix e) acc . toStreamIx+{-# INLINE sifoldl #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sifoldlM :: (Stream r ix e, Monad m) => (a -> ix -> e -> m a) -> a -> Array r ix e -> m a+sifoldlM f acc = S.foldlM (\a (ix, e) -> f a ix e) acc . S.transStepsId . toStreamIx+{-# INLINE sifoldlM #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sifoldlM_ :: (Stream r ix e, Monad m) => (a -> ix -> e -> m a) -> a -> Array r ix e -> m ()+sifoldlM_ f acc = void . sifoldlM f acc+{-# INLINE sifoldlM_ #-}+++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sor :: Stream r ix Bool => Array r ix Bool -> Bool+sor = S.unId . S.or . toStream+{-# INLINE sor #-}+++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sand :: Stream r ix Bool => Array r ix Bool -> Bool+sand = S.unId . S.and . toStream+{-# INLINE sand #-}+++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sany :: Stream r ix e => (e -> Bool) -> Array r ix e -> Bool+sany f = S.unId . S.or . S.map f . toStream+{-# INLINE sany #-}+++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sall :: Stream r ix e => (e -> Bool) -> Array r ix e -> Bool+sall f = S.unId . S.and . S.map f . toStream+{-# INLINE sall #-}++++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+ssum :: (Num e, Stream r ix e) => Array r ix e -> e+ssum = sfoldl (+) 0+{-# INLINE ssum #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sproduct :: (Num e, Stream r ix e) => Array r ix e -> e+sproduct = sfoldl (*) 1+{-# INLINE sproduct #-}+++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+smaximum' :: (Ord e, Stream r ix e) => Array r ix e -> e+smaximum' = sfoldl1' max+{-# INLINE smaximum' #-}++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+smaximumM :: (Ord e, Stream r ix e, MonadThrow m) => Array r ix e -> m e+smaximumM = sfoldl1M (\e acc -> pure (max e acc))+{-# INLINE smaximumM #-}++++-- |+--+-- ==== __Examples__+--+-- @since 0.5.0+sminimum' :: (Ord e, Stream r ix e) => Array r ix e -> e+sminimum' = sfoldl1' min+{-# INLINE sminimum' #-}++-- |+--+-- ==== __Examples__ -- -- @since 0.5.0 sminimumM :: (Ord e, Stream r ix e, MonadThrow m) => Array r ix e -> m e
src/Data/Massiv/Vector/Stream.hs view
@@ -100,8 +100,10 @@ -- ** Unfolding , unfoldr , unfoldrN+ , unsafeUnfoldrN , unfoldrM , unfoldrNM+ , unsafeUnfoldrNM , unfoldrExactN , unfoldrExactNM -- ** Enumeration@@ -110,6 +112,7 @@ , toList , fromList , fromListN+ , unsafeFromListN -- ** Filter , mapMaybe , mapMaybeA@@ -748,17 +751,25 @@ {-# INLINE unfoldr #-} unfoldrN :: Monad m => Int -> (s -> Maybe (e, s)) -> s -> Steps m e-unfoldrN n f e0 = Steps (S.unfoldrN n f e0) (Max n)+unfoldrN n f e0 = Steps (S.unfoldrN n f e0) Unknown {-# INLINE unfoldrN #-} +unsafeUnfoldrN :: Monad m => Int -> (s -> Maybe (e, s)) -> s -> Steps m e+unsafeUnfoldrN n f e0 = Steps (S.unfoldrN n f e0) (Max n)+{-# INLINE unsafeUnfoldrN #-}+ unfoldrM :: Monad m => (s -> m (Maybe (e, s))) -> s -> Steps m e unfoldrM f e0 = Steps (S.unfoldrM f e0) Unknown {-# INLINE unfoldrM #-} unfoldrNM :: Monad m => Int -> (s -> m (Maybe (e, s))) -> s -> Steps m e-unfoldrNM n f e0 = Steps (S.unfoldrNM n f e0) (Max n)+unfoldrNM n f e0 = Steps (S.unfoldrNM n f e0) Unknown {-# INLINE unfoldrNM #-} +unsafeUnfoldrNM :: Monad m => Int -> (s -> m (Maybe (e, s))) -> s -> Steps m e+unsafeUnfoldrNM n f e0 = Steps (S.unfoldrNM n f e0) (Max n)+{-# INLINE unsafeUnfoldrNM #-}+ unfoldrExactN :: Monad m => Int -> (s -> (a, s)) -> s -> Steps m a unfoldrExactN n f = unfoldrExactNM n (pure . f) {-# INLINE unfoldrExactN #-}@@ -789,8 +800,12 @@ {-# INLINE fromList #-} fromListN :: Monad m => Int -> [e] -> Steps m e-fromListN n = (`Steps` Exact n) . S.fromListN n+fromListN n = (`Steps` Unknown) . S.fromListN n {-# INLINE fromListN #-}++unsafeFromListN :: Monad m => Int -> [e] -> Steps m e+unsafeFromListN n = (`Steps` Max n) . S.fromListN n+{-# INLINE unsafeFromListN #-} liftListA :: (Monad m, Functor f) => ([a] -> f [b]) -> S.Stream Id a -> f (S.Stream m b) liftListA f str = S.fromList <$> f (unId (S.toList str))
src/Data/Massiv/Vector/Unsafe.hs view
@@ -33,10 +33,16 @@ -- , unsafeBackpermute -- -- ** Predicates -- , unsafePartition+ -- ** Unbounded streams+ , unsafeUnfoldrN+ , unsafeUnfoldrNM+ , unsafeFromListN ) where import Data.Coerce import Data.Massiv.Core.Common+import Data.Massiv.Array.Delayed.Stream+import qualified Data.Massiv.Vector.Stream as S -- ========= -- -- Accessors --@@ -123,3 +129,48 @@ unsafeDrop (Sz d) v = unsafeLinearSlice d (SafeSz (coerce (size v) - d)) v {-# INLINE unsafeDrop #-} ++-- | /O(n)/ - Convert a list of a known length to a delayed stream vector.+--+-- /Unsafe/ - This function is unsafe because it will allocate enough space in memory for+-- @n@ elements ahead of time, regardless of the actual size of the list. Supplying @n@+-- that is too big will result in an asynchronous `Control.Exception.Base.HeapOverflow`+-- exception.+--+-- @since 0.5.1+unsafeFromListN :: Sz1 -> [e] -> Vector DS e+unsafeFromListN (Sz n) = fromSteps . S.unsafeFromListN n+{-# INLINE unsafeFromListN #-}++-- | /O(n)/ - Right unfolding function with at most @n@ number of elements.+--+-- /Unsafe/ - This function is unsafe because it will allocate enough space in memory for+-- @n@ elements ahead of time, regardless of when unfolding function returns a+-- `Nothing`. Supplying @n@ that is too big will result in an asynchronous+-- `Control.Exception.Base.HeapOverflow` exception.+--+-- @since 0.5.1+unsafeUnfoldrN ::+ Sz1+ -- ^ @n@ - maximum number of elements that the vector will have+ -> (s -> Maybe (e, s))+ -- ^ Unfolding function. Stops when `Nothing` is returned or maximum number of elements+ -- is reached.+ -> s -- ^ Inititial element.+ -> Vector DS e+unsafeUnfoldrN (Sz n) f = DSArray . S.unsafeUnfoldrN n f+{-# INLINE unsafeUnfoldrN #-}++++-- | /O(n)/ - Same as `unsafeUnfoldrN`, but with monadic generating function.+--+-- /Unsafe/ - This function is unsafe because it will allocate enough space in memory for+-- @n@ elements ahead of time, regardless of when unfolding function returns a+-- `Nothing`. Supplying @n@ that is too big will result in an asynchronous+-- `Control.Exception.Base.HeapOverflow` exception.+--+-- @since 0.5.1+unsafeUnfoldrNM :: Monad m => Sz1 -> (s -> m (Maybe (e, s))) -> s -> m (Vector DS e)+unsafeUnfoldrNM (Sz n) f = fromStepsM . S.unsafeUnfoldrNM n f+{-# INLINE unsafeUnfoldrNM #-}