module Data.Continue (
Continue (..)
) where
import Control.Applicative (Applicative (..))
import Control.Monad (Monad (..))
import Data.Bifunctor (Bifunctor (..))
import Data.Eq (Eq)
import Data.Foldable (Foldable (..))
import Data.Function (($),)
import Data.Functor (Functor (..), (<$>))
import Data.Traversable (Traversable (..))
import Text.Show (Show)
data Continue x a =
Stop
| Failure x
| Continue a
deriving (Eq, Show, Functor, Foldable, Traversable)
instance Applicative (Continue x) where
(<*>) ff fa =
case fa of
Stop ->
Stop
Failure x ->
Failure x
Continue a ->
($ a) <$> ff
pure a =
Continue a
instance Bifunctor Continue where
bimap f g ta =
case ta of
Stop ->
Stop
Failure x ->
Failure $ f x
Continue a ->
Continue $ g a
instance Monad (Continue x) where
(>>=) ma f =
case ma of
Stop ->
Stop
Failure x ->
Failure x
Continue a ->
f a