module AesonValueParser.Vector where

import AesonValueParser.Prelude hiding (Vector)
import qualified Data.Vector.Fusion.Bundle.Monadic as BundleM
import Data.Vector.Generic

{-# INLINE ifoldrM #-}
ifoldrM :: (Vector v a, Monad m) => (Int -> a -> b -> m b) -> b -> v a -> m b
ifoldrM :: (Int -> a -> b -> m b) -> b -> v a -> m b
ifoldrM Int -> a -> b -> m b
f b
z = ((Int, a) -> b -> m b) -> b -> Bundle m v (Int, a) -> m b
forall (m :: * -> *) a b (v :: * -> *).
Monad m =>
(a -> b -> m b) -> b -> Bundle m v a -> m b
BundleM.foldrM ((Int -> a -> b -> m b) -> (Int, a) -> b -> m b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> a -> b -> m b
f) b
z (Bundle m v (Int, a) -> m b)
-> (v a -> Bundle m v (Int, a)) -> v a -> m b
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat 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 k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat 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