module Data.ApplicativeChain where import Control.Applicative (Applicative(pure, (<*>)), ) data T a = Cons {runAll :: RunAll, result :: a} data RunAll = RunAll deriving Show instance Functor T where fmap f ~(Cons as a) = Cons as $ f a instance Applicative T where pure = Cons RunAll Cons fs f <*> a = fmap f $ case fs of RunAll -> a