packages feed

dunai-0.8.3: src/Data/MonadicStreamFunction/Instances/ArrowPlus.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
-- |
-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
-- License    : BSD3
-- Maintainer : ivan.perez@keera.co.uk
--
-- Instance of 'ArrowPlus' for Monadic Stream Functions ('MSF').
--
-- Import this module to include that (orphan) instance.
--
-- This is only defined for monads that are instances of 'MonadPlus'.
module Data.MonadicStreamFunction.Instances.ArrowPlus where

-- External imports
import Control.Applicative (Alternative (..))
import Control.Arrow       (ArrowPlus (..), ArrowZero (..))
import Control.Monad       (MonadPlus, mplus, mzero)

-- Internal imports
import Data.MonadicStreamFunction.Core         ()
import Data.MonadicStreamFunction.InternalCore (MSF (MSF, unMSF))

-- | Instance of 'ArrowZero' for Monadic Stream Functions ('MSF'). The monad
-- must be an instance of 'MonadPlus'.
instance (Monad m, MonadPlus m) => ArrowZero (MSF m) where
  zeroArrow = MSF $ const mzero

-- | Instance of 'ArrowPlus' for Monadic Stream Functions ('MSF'). The monad
-- must be an instance of 'MonadPlus'.
instance (Monad m, MonadPlus m) => ArrowPlus (MSF m) where
  sf1 <+> sf2 = MSF $ \a -> unMSF sf1 a `mplus` unMSF sf2 a

-- | Instance of 'Alternative' for Monadic Stream Functions ('MSF'),
-- implemented using the 'ArrowZero' and 'ArrowPlus' instances.
instance (Functor m, Monad m, MonadPlus m) => Alternative (MSF m a) where
  empty = zeroArrow
  (<|>) = (<+>)