packages feed

extended-containers-0.1.1.0: src/Util/Internal/Indexed.hs

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)