module Util.Internal.Indexed where
-- | > Compose (State Int) f a
newtype Indexed f a = Indexed { runIndexed :: Int -> (f a, Int) }
instance Functor f => Functor (Indexed f) where
fmap f (Indexed sf) = Indexed $ \s -> let (x, s') = sf s in (fmap f x, s')
instance Applicative f => Applicative (Indexed f) where
pure x = Indexed $ (,) (pure x)
Indexed sfa <*> Indexed sfb = Indexed $ \s ->
let (f, s') = sfa s
(x, s'') = sfb s'
in (f <*> x, s'')
evalIndexed :: Indexed f a -> Int -> f a
evalIndexed (Indexed sf) x = fst (sf x)