-- | Monadic vector functions with @PrimMonad m@ constraints. They can fuse well.
--
-- Related issue: https://www.github.com/haskell/vector/issues/416.
--
-- Note that these functions are not 100% guaranteed to be sound.
--
-- @since 1.5.2.0
module AtCoder.Extra.Vector.Prim
  ( -- * Construction

    -- ** Monadic initialization
    replicateM,
    generateM,
    iterateNM,

    -- ** Unfolding
    constructNM,
    constructrNM,

    -- * Elementwise operations

    -- ** Monadic mapping
    mapM,
    mapM_,
    imapM,
    imapM_,
    forM,
    forM_,
    iforM,
    iforM_,

    -- ** Monadic zipping
    zipWithM,
    zipWithM_,
    izipWithM,
    izipWithM_,

    -- * Concat map
    concatMapM,
    iconcatMapM,

    -- * Working with predicates

    -- ** Filtering
    filterM,
    mapMaybeM,
    imapMaybeM,

    -- ** Monadic scanl
    prescanlM,
    prescanlM',
    postscanlM,
    postscanlM',
    scanlM,
    scanlM',
    scanl1M,
    scanl1M',
  )
where

import Control.Monad.Primitive (PrimMonad)
import Data.Vector.Fusion.Bundle qualified as Bundle
import Data.Vector.Fusion.Bundle.Monadic qualified as BundleM
import Data.Vector.Generic qualified as VG
import Data.Vector.Generic.Mutable qualified as VGM
import GHC.Stack (HasCallStack)
import Prelude hiding (mapM, mapM_)

-- | ==== Constraints
-- - \(n \ge 0\)
--
-- @since 1.5.2.0
{-# INLINE replicateM #-}
replicateM :: (PrimMonad m, VG.Vector v a) => Int -> m a -> m (v a)
replicateM :: forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Int -> m a -> m (v a)
replicateM Int
n m a
f = Bundle m Any a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Int -> m a -> Bundle m Any a
forall (m :: * -> *) a (v :: * -> *).
Monad m =>
Int -> m a -> Bundle m v a
BundleM.replicateM Int
n m a
f)

-- | ==== Constraints
-- - \(n \ge 0\)
--
-- @since 1.5.2.0
{-# INLINE generateM #-}
generateM :: (PrimMonad m, VG.Vector v a) => Int -> (Int -> m a) -> m (v a)
generateM :: forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Int -> (Int -> m a) -> m (v a)
generateM Int
n Int -> m a
f = Bundle m Any a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Int -> (Int -> m a) -> Bundle m Any a
forall (m :: * -> *) a (v :: * -> *).
Monad m =>
Int -> (Int -> m a) -> Bundle m v a
BundleM.generateM Int
n Int -> m a
f)

-- | ==== Constraints
-- - \(n \ge 0\)
--
-- @since 1.5.2.0
{-# INLINE iterateNM #-}
iterateNM :: (PrimMonad m, VG.Vector v a) => Int -> (a -> m a) -> a -> m (v a)
iterateNM :: forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Int -> (a -> m a) -> a -> m (v a)
iterateNM Int
n a -> m a
f a
x = Bundle m Any a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Int -> (a -> m a) -> a -> Bundle m Any a
forall (m :: * -> *) a (u :: * -> *).
Monad m =>
Int -> (a -> m a) -> a -> Bundle m u a
BundleM.iterateNM Int
n a -> m a
f a
x)

-- | ==== Constraints
-- - \(n \ge 0\)
--
-- @since 1.5.2.0
{-# INLINE constructNM #-}
constructNM :: forall m v a. (PrimMonad m, VG.Vector v a) => Int -> (v a -> m a) -> m (v a)
constructNM :: forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Int -> (v a -> m a) -> m (v a)
constructNM Int
n v a -> m a
f = do
  Mutable v (PrimState m) a
v <- Int -> m (Mutable v (PrimState m) a)
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
Int -> m (v (PrimState m) a)
VGM.new Int
n
  v a
v' <- Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze Mutable v (PrimState m) a
v
  v a -> Int -> m (v a)
fill v a
v' Int
0
  where
    fill :: v a ->Int -> m (v a)
    fill :: v a -> Int -> m (v a)
fill !v a
v Int
i
      | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = do
          a
x <- v a -> m a
f (Int -> v a -> v a
forall (v :: * -> *) a. Vector v a => Int -> v a -> v a
VG.unsafeTake Int
i v a
v)
          v a -> a -> m (v a) -> m (v a)
forall b. v a -> a -> b -> b
forall (v :: * -> *) a b. Vector v a => v a -> a -> b -> b
VG.elemseq v a
v a
x (m (v a) -> m (v a)) -> m (v a) -> m (v a)
forall a b. (a -> b) -> a -> b
$ do
            Mutable v (PrimState m) a
v' <- v a -> m (Mutable v (PrimState m) a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.unsafeThaw v a
v
            Mutable v (PrimState m) a -> Int -> a -> m ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
VGM.unsafeWrite Mutable v (PrimState m) a
v' Int
i a
x
            v a
v'' <- Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze Mutable v (PrimState m) a
v'
            v a -> Int -> m (v a)
fill v a
v'' (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
    fill v a
v Int
_ = v a -> m (v a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure v a
v

-- | ==== Constraints
-- - \(n \ge 0\)
--
-- @since 1.5.2.0
{-# INLINE constructrNM #-}
constructrNM :: forall m v a. (PrimMonad m, VG.Vector v a) => Int -> (v a -> m a) -> m (v a)
constructrNM :: forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Int -> (v a -> m a) -> m (v a)
constructrNM Int
n v a -> m a
f = do
  Mutable v (PrimState m) a
v <- Int
n Int
-> m (Mutable v (PrimState m) a) -> m (Mutable v (PrimState m) a)
forall a b. a -> b -> b
`seq` Int -> m (Mutable v (PrimState m) a)
forall (m :: * -> *) (v :: * -> * -> *) a.
(HasCallStack, PrimMonad m, MVector v a) =>
Int -> m (v (PrimState m) a)
VGM.new Int
n
  v a
v' <- Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze Mutable v (PrimState m) a
v
  v a -> Int -> m (v a)
fill v a
v' Int
0
  where
    fill :: v a ->Int -> m (v a)
    fill :: v a -> Int -> m (v a)
fill !v a
v Int
i
      | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = do
          a
x <- v a -> m a
f (Int -> Int -> v a -> v a
forall (v :: * -> *) a. Vector v a => Int -> Int -> v a -> v a
VG.unsafeSlice (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i) Int
i v a
v)
          v a -> a -> m (v a) -> m (v a)
forall b. v a -> a -> b -> b
forall (v :: * -> *) a b. Vector v a => v a -> a -> b -> b
VG.elemseq v a
v a
x (m (v a) -> m (v a)) -> m (v a) -> m (v a)
forall a b. (a -> b) -> a -> b
$ do
            Mutable v (PrimState m) a
v' <- v a -> m (Mutable v (PrimState m) a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.unsafeThaw v a
v
            Mutable v (PrimState m) a -> Int -> a -> m ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
VGM.unsafeWrite Mutable v (PrimState m) a
v' (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) a
x
            v a
v'' <- Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze Mutable v (PrimState m) a
v'
            v a -> Int -> m (v a)
fill v a
v'' (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
    fill v a
v Int
_ = v a -> m (v a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure v a
v

-- | @since 1.5.2.0
{-# INLINE mapM #-}
mapM :: (PrimMonad m, VG.Vector v a, VG.Vector v b) => (a -> m b) -> v a -> m (v b)
mapM :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a, Vector v b) =>
(a -> m b) -> v a -> m (v b)
mapM a -> m b
f = Bundle m v b -> m (v b)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Bundle m v b -> m (v b))
-> (v a -> Bundle m v b) -> v a -> m (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m b) -> Bundle v a -> Bundle m v b
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> m b) -> Bundle v a -> Bundle m v b
Bundle.mapM a -> m b
f (Bundle v a -> Bundle m v b)
-> (v a -> Bundle v a) -> v a -> Bundle m v b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE imapM #-}
imapM :: (PrimMonad m, VG.Vector v a, VG.Vector v b) => (Int -> a -> m b) -> v a -> m (v b)
imapM :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a, Vector v b) =>
(Int -> a -> m b) -> v a -> m (v b)
imapM Int -> a -> m b
f = Bundle m v b -> m (v b)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Bundle m v b -> m (v b))
-> (v a -> Bundle m v b) -> v a -> m (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, a) -> m b) -> Bundle v (Int, a) -> Bundle m v b
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> m b) -> Bundle v a -> Bundle m v b
Bundle.mapM ((Int -> a -> m b) -> (Int, a) -> m b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> a -> m b
f) (Bundle v (Int, a) -> Bundle m v b)
-> (v a -> Bundle v (Int, a)) -> v a -> Bundle m v b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v a -> Bundle v (Int, a)
forall (v :: * -> *) a. Bundle v a -> Bundle v (Int, a)
Bundle.indexed (Bundle v a -> Bundle v (Int, a))
-> (v a -> Bundle v a) -> v a -> Bundle v (Int, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE mapM_ #-}
mapM_ :: (PrimMonad m, VG.Vector v a) => (a -> m b) -> v a -> m ()
mapM_ :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a) =>
(a -> m b) -> v a -> m ()
mapM_ a -> m b
f = (a -> m b) -> Bundle v a -> m ()
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> m b) -> Bundle v a -> m ()
Bundle.mapM_ a -> m b
f (Bundle v a -> m ()) -> (v a -> Bundle v a) -> v a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE imapM_ #-}
imapM_ :: (PrimMonad m, VG.Vector v a) => (Int -> a -> m b) -> v a -> m ()
imapM_ :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a) =>
(Int -> a -> m b) -> v a -> m ()
imapM_ Int -> a -> m b
f = ((Int, a) -> m b) -> Bundle v (Int, a) -> m ()
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> m b) -> Bundle v a -> m ()
Bundle.mapM_ ((Int -> a -> m b) -> (Int, a) -> m b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> a -> m b
f) (Bundle v (Int, a) -> m ())
-> (v a -> Bundle v (Int, a)) -> v a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v a -> Bundle v (Int, a)
forall (v :: * -> *) a. Bundle v a -> Bundle v (Int, a)
Bundle.indexed (Bundle v a -> Bundle v (Int, a))
-> (v a -> Bundle v a) -> v a -> Bundle v (Int, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE forM #-}
forM :: (PrimMonad m, VG.Vector v a, VG.Vector v b) => v a -> (a -> m b) -> m (v b)
forM :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a, Vector v b) =>
v a -> (a -> m b) -> m (v b)
forM v a
as a -> m b
f = (a -> m b) -> v a -> m (v b)
forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a, Vector v b) =>
(a -> m b) -> v a -> m (v b)
mapM a -> m b
f v a
as

-- | @since 1.5.2.0
{-# INLINE forM_ #-}
forM_ :: (PrimMonad m, VG.Vector v a) => v a -> (a -> m b) -> m ()
forM_ :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a) =>
v a -> (a -> m b) -> m ()
forM_ v a
as a -> m b
f = (a -> m b) -> v a -> m ()
forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a) =>
(a -> m b) -> v a -> m ()
mapM_ a -> m b
f v a
as

-- | @since 1.5.2.0
iforM :: (PrimMonad m, VG.Vector v a, VG.Vector v b) => v a -> (Int -> a -> m b) -> m (v b)
{-# INLINE iforM #-}
iforM :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a, Vector v b) =>
v a -> (Int -> a -> m b) -> m (v b)
iforM v a
as Int -> a -> m b
f = (Int -> a -> m b) -> v a -> m (v b)
forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a, Vector v b) =>
(Int -> a -> m b) -> v a -> m (v b)
imapM Int -> a -> m b
f v a
as

-- | @since 1.5.2.0
{-# INLINE iforM_ #-}
iforM_ :: (PrimMonad m, VG.Vector v a) => v a -> (Int -> a -> m b) -> m ()
iforM_ :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a) =>
v a -> (Int -> a -> m b) -> m ()
iforM_ v a
as Int -> a -> m b
f = (Int -> a -> m b) -> v a -> m ()
forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a) =>
(Int -> a -> m b) -> v a -> m ()
imapM_ Int -> a -> m b
f v a
as

-- | @since 1.5.2.0
{-# INLINE zipWithM #-}
zipWithM :: (PrimMonad m, VG.Vector v a, VG.Vector v b, VG.Vector v c) => (a -> b -> m c) -> v a -> v b -> m (v c)
zipWithM :: forall (m :: * -> *) (v :: * -> *) a b c.
(PrimMonad m, Vector v a, Vector v b, Vector v c) =>
(a -> b -> m c) -> v a -> v b -> m (v c)
zipWithM a -> b -> m c
f = \v a
as v b
bs -> Bundle m v c -> m (v c)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Bundle m v c -> m (v c)) -> Bundle m v c -> m (v c)
forall a b. (a -> b) -> a -> b
$ (a -> b -> m c) -> Bundle v a -> Bundle v b -> Bundle m v c
forall (m :: * -> *) a b c (v :: * -> *).
Monad m =>
(a -> b -> m c) -> Bundle v a -> Bundle v b -> Bundle m v c
Bundle.zipWithM a -> b -> m c
f (v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream v a
as) (v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream v b
bs)

-- | @since 1.5.2.0
{-# INLINE izipWithM #-}
izipWithM :: (PrimMonad m, VG.Vector v a, VG.Vector v b, VG.Vector v c) => (Int -> a -> b -> m c) -> v a -> v b -> m (v c)
izipWithM :: forall (m :: * -> *) (v :: * -> *) a b c.
(PrimMonad m, Vector v a, Vector v b, Vector v c) =>
(Int -> a -> b -> m c) -> v a -> v b -> m (v c)
izipWithM Int -> a -> b -> m c
m v a
as v b
bs = Bundle m v c -> m (v c)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Bundle m v c -> m (v c))
-> (Bundle v b -> Bundle m v c) -> Bundle v b -> m (v c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, a) -> b -> m c)
-> Bundle v (Int, a) -> Bundle v b -> Bundle m v c
forall (m :: * -> *) a b c (v :: * -> *).
Monad m =>
(a -> b -> m c) -> Bundle v a -> Bundle v b -> Bundle m v c
Bundle.zipWithM ((Int -> a -> b -> m c) -> (Int, a) -> b -> m c
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> a -> b -> m c
m) (Bundle v a -> Bundle v (Int, a)
forall (v :: * -> *) a. Bundle v a -> Bundle v (Int, a)
Bundle.indexed (v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream v a
as)) (Bundle v b -> m (v c)) -> Bundle v b -> m (v c)
forall a b. (a -> b) -> a -> b
$ v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream v b
bs

-- | @since 1.5.2.0
{-# INLINE zipWithM_ #-}
zipWithM_ :: (PrimMonad m, VG.Vector v a, VG.Vector v b) => (a -> b -> m c) -> v a -> v b -> m ()
zipWithM_ :: forall (m :: * -> *) (v :: * -> *) a b c.
(PrimMonad m, Vector v a, Vector v b) =>
(a -> b -> m c) -> v a -> v b -> m ()
zipWithM_ a -> b -> m c
f = \v a
as v b
bs -> (a -> b -> m c) -> Bundle v a -> Bundle v b -> m ()
forall (m :: * -> *) a b c (v :: * -> *).
Monad m =>
(a -> b -> m c) -> Bundle v a -> Bundle v b -> m ()
Bundle.zipWithM_ a -> b -> m c
f (v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream v a
as) (v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream v b
bs)

-- | @since 1.5.2.0
{-# INLINE izipWithM_ #-}
izipWithM_ :: (PrimMonad m, VG.Vector v a, VG.Vector v b) => (Int -> a -> b -> m c) -> v a -> v b -> m ()
izipWithM_ :: forall (m :: * -> *) (v :: * -> *) a b c.
(PrimMonad m, Vector v a, Vector v b) =>
(Int -> a -> b -> m c) -> v a -> v b -> m ()
izipWithM_ Int -> a -> b -> m c
m v a
as v b
bs = ((Int, a) -> b -> m c) -> Bundle v (Int, a) -> Bundle v b -> m ()
forall (m :: * -> *) a b c (v :: * -> *).
Monad m =>
(a -> b -> m c) -> Bundle v a -> Bundle v b -> m ()
Bundle.zipWithM_ ((Int -> a -> b -> m c) -> (Int, a) -> b -> m c
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> a -> b -> m c
m) (Bundle v a -> Bundle v (Int, a)
forall (v :: * -> *) a. Bundle v a -> Bundle v (Int, a)
Bundle.indexed (v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream v a
as)) (Bundle v b -> m ()) -> Bundle v b -> m ()
forall a b. (a -> b) -> a -> b
$ v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream v b
bs

-- | Maps each element to a vector and concatenate the results.
--
-- @since 1.5.2.0
{-# INLINE concatMapM #-}
concatMapM ::
  (HasCallStack, PrimMonad m, VG.Vector v a, VG.Vector v b) =>
  (a -> m (v b)) ->
  v a ->
  m (v b)
concatMapM :: forall (m :: * -> *) (v :: * -> *) a b.
(HasCallStack, PrimMonad m, Vector v a, Vector v b) =>
(a -> m (v b)) -> v a -> m (v b)
concatMapM a -> m (v b)
f =
  Bundle m v b -> m (v b)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v b -> m (v b))
-> (v a -> Bundle m v b) -> v a -> m (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle m v (v b) -> Bundle m v b
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(Monad m, Vector v a) =>
Bundle m u (v a) -> Bundle m v a
BundleM.concatVectors
    (Bundle m v (v b) -> Bundle m v b)
-> (v a -> Bundle m v (v b)) -> v a -> Bundle m v b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m (v b)) -> Bundle m v a -> Bundle m v (v b)
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> m b) -> Bundle m v a -> Bundle m v b
BundleM.mapM a -> m (v b)
f
    (Bundle m v a -> Bundle m v (v b))
-> (v a -> Bundle m v a) -> v a -> Bundle m v (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle m v a
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
v a -> Bundle m v a
BundleM.fromVector

-- | Maps each element to a vector and concatenate the results.
--
-- @since 1.5.2.0
{-# INLINE iconcatMapM #-}
iconcatMapM ::
  (HasCallStack, PrimMonad m, VG.Vector v a, VG.Vector v b) =>
  (Int -> a -> m (v b)) ->
  v a ->
  m (v b)
iconcatMapM :: forall (m :: * -> *) (v :: * -> *) a b.
(HasCallStack, PrimMonad m, Vector v a, Vector v b) =>
(Int -> a -> m (v b)) -> v a -> m (v b)
iconcatMapM Int -> a -> m (v b)
f =
  Bundle m v b -> m (v b)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v b -> m (v b))
-> (v a -> Bundle m v b) -> v a -> m (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle m v (v b) -> Bundle m v b
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(Monad m, Vector v a) =>
Bundle m u (v a) -> Bundle m v a
BundleM.concatVectors
    (Bundle m v (v b) -> Bundle m v b)
-> (v a -> Bundle m v (v b)) -> v a -> Bundle m v b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, a) -> m (v b)) -> Bundle m v (Int, a) -> Bundle m v (v b)
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> m b) -> Bundle m v a -> Bundle m v b
BundleM.mapM ((Int -> a -> m (v b)) -> (Int, a) -> m (v b)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> a -> m (v b)
f)
    (Bundle m v (Int, a) -> Bundle m v (v b))
-> (v a -> Bundle m v (Int, a)) -> v a -> Bundle m v (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle m v a -> Bundle m v (Int, a)
forall (m :: * -> *) (v :: * -> *) a.
Monad m =>
Bundle m v a -> Bundle m v (Int, a)
BundleM.indexed
    (Bundle m v a -> Bundle m v (Int, a))
-> (v a -> Bundle m v a) -> v a -> Bundle m v (Int, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle m v a
forall (m :: * -> *) (v :: * -> *) a.
(Monad m, Vector v a) =>
v a -> Bundle m v a
BundleM.fromVector

-- | @since 1.5.2.0
{-# INLINE filterM #-}
filterM :: (PrimMonad m, VG.Vector v a) => (a -> m Bool) -> v a -> m (v a)
filterM :: forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
(a -> m Bool) -> v a -> m (v a)
filterM a -> m Bool
f = Bundle m v a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Bundle m v a -> m (v a))
-> (v a -> Bundle m v a) -> v a -> m (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m Bool) -> Bundle v a -> Bundle m v a
forall (m :: * -> *) a (v :: * -> *).
Monad m =>
(a -> m Bool) -> Bundle v a -> Bundle m v a
Bundle.filterM a -> m Bool
f (Bundle v a -> Bundle m v a)
-> (v a -> Bundle v a) -> v a -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
mapMaybeM :: (PrimMonad m, VG.Vector v a, VG.Vector v b) => (a -> m (Maybe b)) -> v a -> m (v b)
{-# INLINE mapMaybeM #-}
mapMaybeM :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a, Vector v b) =>
(a -> m (Maybe b)) -> v a -> m (v b)
mapMaybeM a -> m (Maybe b)
f = Bundle m v b -> m (v b)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Bundle m v b -> m (v b))
-> (v a -> Bundle m v b) -> v a -> m (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m (Maybe b)) -> Bundle v a -> Bundle m v b
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> m (Maybe b)) -> Bundle v a -> Bundle m v b
Bundle.mapMaybeM a -> m (Maybe b)
f (Bundle v a -> Bundle m v b)
-> (v a -> Bundle v a) -> v a -> Bundle m v b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 0.12.2.0
{-# INLINE imapMaybeM #-}
imapMaybeM :: (PrimMonad m, VG.Vector v a, VG.Vector v b) => (Int -> a -> m (Maybe b)) -> v a -> m (v b)
imapMaybeM :: forall (m :: * -> *) (v :: * -> *) a b.
(PrimMonad m, Vector v a, Vector v b) =>
(Int -> a -> m (Maybe b)) -> v a -> m (v b)
imapMaybeM Int -> a -> m (Maybe b)
f = Bundle m v b -> m (v b)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM (Bundle m v b -> m (v b))
-> (v a -> Bundle m v b) -> v a -> m (v b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, a) -> m (Maybe b)) -> Bundle v (Int, a) -> Bundle m v b
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> m (Maybe b)) -> Bundle v a -> Bundle m v b
Bundle.mapMaybeM (\(Int
i, a
a) -> Int -> a -> m (Maybe b)
f Int
i a
a) (Bundle v (Int, a) -> Bundle m v b)
-> (v a -> Bundle v (Int, a)) -> v a -> Bundle m v b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v a -> Bundle v (Int, a)
forall (v :: * -> *) a. Bundle v a -> Bundle v (Int, a)
Bundle.indexed (Bundle v a -> Bundle v (Int, a))
-> (v a -> Bundle v a) -> v a -> Bundle v (Int, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | https://github.com/haskell/vector/issues/416
{-# INLINE [1] unstreamPrimM #-}
unstreamPrimM :: (PrimMonad m, VG.Vector v a) => BundleM.Bundle m u a -> m (v a)
unstreamPrimM :: forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM Bundle m u a
s = Bundle m u a -> m (Mutable v (PrimState m) a)
forall (m :: * -> *) (v :: * -> * -> *) a (u :: * -> *).
(PrimMonad m, MVector v a) =>
MBundle m u a -> m (v (PrimState m) a)
VGM.munstream Bundle m u a
s m (Mutable v (PrimState m) a)
-> (Mutable v (PrimState m) a -> m (v a)) -> m (v a)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Mutable v (PrimState m) a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze

-- | @since 1.5.2.0
{-# INLINE prescanlM #-}
prescanlM :: (HasCallStack, PrimMonad m, VG.Vector v a, VG.Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
prescanlM :: forall (m :: * -> *) (v :: * -> *) a b.
(HasCallStack, PrimMonad m, Vector v a, Vector v b) =>
(a -> b -> m a) -> a -> v b -> m (v a)
prescanlM a -> b -> m a
f a
x0 =
  Bundle m v a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v a -> m (v a))
-> (v b -> Bundle m v a) -> v b -> m (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
prescanlMB a -> b -> m a
f a
x0
    (Bundle v b -> Bundle m v a)
-> (v b -> Bundle v b) -> v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE prescanlM' #-}
prescanlM' :: (HasCallStack, PrimMonad m, VG.Vector v a, VG.Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
prescanlM' :: forall (m :: * -> *) (v :: * -> *) a b.
(HasCallStack, PrimMonad m, Vector v a, Vector v b) =>
(a -> b -> m a) -> a -> v b -> m (v a)
prescanlM' a -> b -> m a
f a
x0 =
  Bundle m v a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v a -> m (v a))
-> (v b -> Bundle m v a) -> v b -> m (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
prescanlMB' a -> b -> m a
f a
x0
    (Bundle v b -> Bundle m v a)
-> (v b -> Bundle v b) -> v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE postscanlM #-}
postscanlM :: (HasCallStack, PrimMonad m, VG.Vector v a, VG.Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
postscanlM :: forall (m :: * -> *) (v :: * -> *) a b.
(HasCallStack, PrimMonad m, Vector v a, Vector v b) =>
(a -> b -> m a) -> a -> v b -> m (v a)
postscanlM a -> b -> m a
f a
x0 =
  Bundle m v a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v a -> m (v a))
-> (v b -> Bundle m v a) -> v b -> m (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
postscanlMB a -> b -> m a
f a
x0
    (Bundle v b -> Bundle m v a)
-> (v b -> Bundle v b) -> v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE postscanlM' #-}
postscanlM' :: (HasCallStack, PrimMonad m, VG.Vector v a, VG.Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
postscanlM' :: forall (m :: * -> *) (v :: * -> *) a b.
(HasCallStack, PrimMonad m, Vector v a, Vector v b) =>
(a -> b -> m a) -> a -> v b -> m (v a)
postscanlM' a -> b -> m a
f a
x0 =
  Bundle m v a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v a -> m (v a))
-> (v b -> Bundle m v a) -> v b -> m (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
postscanlMB' a -> b -> m a
f a
x0
    (Bundle v b -> Bundle m v a)
-> (v b -> Bundle v b) -> v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE scanlM #-}
scanlM :: (HasCallStack, PrimMonad m, VG.Vector v a, VG.Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
scanlM :: forall (m :: * -> *) (v :: * -> *) a b.
(HasCallStack, PrimMonad m, Vector v a, Vector v b) =>
(a -> b -> m a) -> a -> v b -> m (v a)
scanlM a -> b -> m a
f a
x0 =
  Bundle m v a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v a -> m (v a))
-> (v b -> Bundle m v a) -> v b -> m (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
scanlMB a -> b -> m a
f a
x0
    (Bundle v b -> Bundle m v a)
-> (v b -> Bundle v b) -> v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE scanlM' #-}
scanlM' :: (HasCallStack, PrimMonad m, VG.Vector v a, VG.Vector v b) => (a -> b -> m a) -> a -> v b -> m (v a)
scanlM' :: forall (m :: * -> *) (v :: * -> *) a b.
(HasCallStack, PrimMonad m, Vector v a, Vector v b) =>
(a -> b -> m a) -> a -> v b -> m (v a)
scanlM' a -> b -> m a
f a
x0 =
  Bundle m v a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v a -> m (v a))
-> (v b -> Bundle m v a) -> v b -> m (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
scanlMB' a -> b -> m a
f a
x0
    (Bundle v b -> Bundle m v a)
-> (v b -> Bundle v b) -> v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v b -> Bundle v b
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE scanl1M #-}
scanl1M :: (HasCallStack, PrimMonad m, VG.Vector v a) => (a -> a -> m a) -> v a -> m (v a)
scanl1M :: forall (m :: * -> *) (v :: * -> *) a.
(HasCallStack, PrimMonad m, Vector v a) =>
(a -> a -> m a) -> v a -> m (v a)
scanl1M a -> a -> m a
f =
  Bundle m v a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v a -> m (v a))
-> (v a -> Bundle m v a) -> v a -> m (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a -> m a) -> Bundle v a -> Bundle m v a
forall (m :: * -> *) a (v :: * -> *).
Monad m =>
(a -> a -> m a) -> Bundle v a -> Bundle m v a
scanl1MB a -> a -> m a
f
    (Bundle v a -> Bundle m v a)
-> (v a -> Bundle v a) -> v a -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

-- | @since 1.5.2.0
{-# INLINE scanl1M' #-}
scanl1M' :: (HasCallStack, PrimMonad m, VG.Vector v a) => (a -> a -> m a) -> v a -> m (v a)
scanl1M' :: forall (m :: * -> *) (v :: * -> *) a.
(HasCallStack, PrimMonad m, Vector v a) =>
(a -> a -> m a) -> v a -> m (v a)
scanl1M' a -> a -> m a
f =
  Bundle m v a -> m (v a)
forall (m :: * -> *) (v :: * -> *) a (u :: * -> *).
(PrimMonad m, Vector v a) =>
Bundle m u a -> m (v a)
unstreamPrimM
    (Bundle m v a -> m (v a))
-> (v a -> Bundle m v a) -> v a -> m (v a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a -> m a) -> Bundle v a -> Bundle m v a
forall (m :: * -> *) a (v :: * -> *).
Monad m =>
(a -> a -> m a) -> Bundle v a -> Bundle m v a
scanl1MB' a -> a -> m a
f
    (Bundle v a -> Bundle m v a)
-> (v a -> Bundle v a) -> v a -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> Bundle v a
forall (v :: * -> *) a. Vector v a => v a -> Bundle v a
VG.stream

{-# INLINE prescanlMB #-}
prescanlMB :: (Monad m) => (a -> b -> m a) -> a -> Bundle.Bundle v b -> BundleM.Bundle m v a
prescanlMB :: forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
prescanlMB a -> b -> m a
f a
x0 = (a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
BundleM.prescanlM a -> b -> m a
f a
x0 (Bundle m v b -> Bundle m v a)
-> (Bundle v b -> Bundle m v b) -> Bundle v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v b -> Bundle m v b
forall (m :: * -> *) (v :: * -> *) a.
Monad m =>
Bundle Id v a -> Bundle m v a
Bundle.lift

{-# INLINE prescanlMB' #-}
prescanlMB' :: (Monad m) => (a -> b -> m a) -> a -> Bundle.Bundle v b -> BundleM.Bundle m v a
prescanlMB' :: forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
prescanlMB' a -> b -> m a
f a
x0 = (a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
BundleM.prescanlM' a -> b -> m a
f a
x0 (Bundle m v b -> Bundle m v a)
-> (Bundle v b -> Bundle m v b) -> Bundle v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v b -> Bundle m v b
forall (m :: * -> *) (v :: * -> *) a.
Monad m =>
Bundle Id v a -> Bundle m v a
Bundle.lift

{-# INLINE postscanlMB #-}
postscanlMB :: (Monad m) => (a -> b -> m a) -> a -> Bundle.Bundle v b -> BundleM.Bundle m v a
postscanlMB :: forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
postscanlMB a -> b -> m a
f a
x0 = (a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
BundleM.postscanlM a -> b -> m a
f a
x0 (Bundle m v b -> Bundle m v a)
-> (Bundle v b -> Bundle m v b) -> Bundle v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v b -> Bundle m v b
forall (m :: * -> *) (v :: * -> *) a.
Monad m =>
Bundle Id v a -> Bundle m v a
Bundle.lift

{-# INLINE postscanlMB' #-}
postscanlMB' :: (Monad m) => (a -> b -> m a) -> a -> Bundle.Bundle v b -> BundleM.Bundle m v a
postscanlMB' :: forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
postscanlMB' a -> b -> m a
f a
x0 = (a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
BundleM.postscanlM' a -> b -> m a
f a
x0 (Bundle m v b -> Bundle m v a)
-> (Bundle v b -> Bundle m v b) -> Bundle v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v b -> Bundle m v b
forall (m :: * -> *) (v :: * -> *) a.
Monad m =>
Bundle Id v a -> Bundle m v a
Bundle.lift

{-# INLINE scanlMB #-}
scanlMB :: (Monad m) => (a -> b -> m a) -> a -> Bundle.Bundle v b -> BundleM.Bundle m v a
scanlMB :: forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
scanlMB a -> b -> m a
f a
x0 = (a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
BundleM.scanlM a -> b -> m a
f a
x0 (Bundle m v b -> Bundle m v a)
-> (Bundle v b -> Bundle m v b) -> Bundle v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v b -> Bundle m v b
forall (m :: * -> *) (v :: * -> *) a.
Monad m =>
Bundle Id v a -> Bundle m v a
Bundle.lift

{-# INLINE scanlMB' #-}
scanlMB' :: (Monad m) => (a -> b -> m a) -> a -> Bundle.Bundle v b -> BundleM.Bundle m v a
scanlMB' :: forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle v b -> Bundle m v a
scanlMB' a -> b -> m a
f a
x0 = (a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m a) -> a -> Bundle m v b -> Bundle m v a
BundleM.scanlM' a -> b -> m a
f a
x0 (Bundle m v b -> Bundle m v a)
-> (Bundle v b -> Bundle m v b) -> Bundle v b -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v b -> Bundle m v b
forall (m :: * -> *) (v :: * -> *) a.
Monad m =>
Bundle Id v a -> Bundle m v a
Bundle.lift

{-# INLINE scanl1MB #-}
scanl1MB :: (Monad m) => (a -> a -> m a) -> Bundle.Bundle v a -> BundleM.Bundle m v a
scanl1MB :: forall (m :: * -> *) a (v :: * -> *).
Monad m =>
(a -> a -> m a) -> Bundle v a -> Bundle m v a
scanl1MB a -> a -> m a
f = (a -> a -> m a) -> Bundle m v a -> Bundle m v a
forall (m :: * -> *) a (v :: * -> *).
Monad m =>
(a -> a -> m a) -> Bundle m v a -> Bundle m v a
BundleM.scanl1M a -> a -> m a
f (Bundle m v a -> Bundle m v a)
-> (Bundle v a -> Bundle m v a) -> Bundle v a -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v a -> Bundle m v a
forall (m :: * -> *) (v :: * -> *) a.
Monad m =>
Bundle Id v a -> Bundle m v a
Bundle.lift

{-# INLINE scanl1MB' #-}
scanl1MB' :: (Monad m) => (a -> a -> m a) -> Bundle.Bundle v a -> BundleM.Bundle m v a
scanl1MB' :: forall (m :: * -> *) a (v :: * -> *).
Monad m =>
(a -> a -> m a) -> Bundle v a -> Bundle m v a
scanl1MB' a -> a -> m a
f = (a -> a -> m a) -> Bundle m v a -> Bundle m v a
forall (m :: * -> *) a (v :: * -> *).
Monad m =>
(a -> a -> m a) -> Bundle m v a -> Bundle m v a
BundleM.scanl1M' a -> a -> m a
f (Bundle m v a -> Bundle m v a)
-> (Bundle v a -> Bundle m v a) -> Bundle v a -> Bundle m v a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle v a -> Bundle m v a
forall (m :: * -> *) (v :: * -> *) a.
Monad m =>
Bundle Id v a -> Bundle m v a
Bundle.lift