content: {-# OPTIONS_HADDOCK not-home #-}
  
  -- | Internal implementation details of indexed folds.
  --
  -- This module is intended for internal use only, and may change without warning
  -- in subsequent releases.
  module Optics.Internal.IxFold where
  
  import Data.Functor
  import Data.Foldable
  
  import Data.Profunctor.Indexed
  
  import Optics.Internal.Bi
  import Optics.Internal.Indexed.Classes
  import Optics.Internal.Optic
  import Optics.Internal.Fold
  
  -- | Internal implementation of 'Optics.IxFold.ifoldVL'.
  ifoldVL__
    :: (Bicontravariant p, Traversing p)
    => (forall f. Applicative f => (i -> a -> f u) -> s -> f v)
    -> Optic__ p j (i -> j) s t a b
  ifoldVL__ f = rphantom . iwander f . rphantom
  {-# INLINE ifoldVL__ #-}
  
  -- | Internal implementation of 'Optics.IxFold.ifolded'.
  ifolded__
    :: (Bicontravariant p, Traversing p, FoldableWithIndex i f)
    => Optic__ p j (i -> j) (f a) t a b
  ifolded__ = conjoined__ (foldVL__ traverse_) (ifoldVL__ itraverse_)
  {-# INLINE ifolded__ #-}
  
  -- | Internal implementation of 'Optics.IxFold.ifoldring'.
  ifoldring__
    :: (Bicontravariant p, Traversing p)
    => (forall f. Applicative f => (i -> a -> f u -> f u) -> f v -> s -> f w)
    -> Optic__ p j (i -> j) s t a b
  ifoldring__ fr = ifoldVL__ $ \f -> void . fr (\i a -> (f i a *>)) (pure v)
    where
      v = error "ifoldring__: value used"
  {-# INLINE ifoldring__ #-}
  