packages feed

cparsing-0.1.0.0: Data/SmartTrav/Indexing.hs

{-# LANGUAGE LambdaCase #-}
module Data.SmartTrav.Indexing where

import Data.SmartTrav.Class
import Control.Monad.State
import Control.Applicative

indexedTraverse :: SmartTrav t => (a -> [Int] -> b) -> t a -> t b
indexedTraverse f
  = flip evalState ([], 0) 
      . smartTrav ( modify (\(st   ,i) -> (i:st ,0)) )
                  ( modify (\(s:st ,_) -> (st   ,s)) ) 
                  ( \a -> f a <$> gets fst <* modify ( \case (s:st,i) -> ((s+1):st,i)
                                                             ([]  ,i) -> ([]      ,i) ) )