futhark-0.7.3: src/Futhark/Optimise/Fusion/TryFusion.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Futhark.Optimise.Fusion.TryFusion
( TryFusion
, tryFusion
, liftMaybe
)
where
import Control.Applicative
import Control.Monad.State
import Control.Monad.Reader
import qualified Control.Monad.Fail as Fail
import Futhark.Representation.SOACS
import Futhark.MonadFreshNames
newtype TryFusion a = TryFusion (ReaderT (Scope SOACS)
(StateT VNameSource Maybe)
a)
deriving (Functor, Applicative, Alternative, Monad, Fail.MonadFail,
MonadFreshNames,
HasScope SOACS,
LocalScope SOACS)
tryFusion :: MonadFreshNames m =>
TryFusion a -> Scope SOACS -> m (Maybe a)
tryFusion (TryFusion m) types = modifyNameSource $ \src ->
case runStateT (runReaderT m types) src of
Just (x, src') -> (Just x, src')
Nothing -> (Nothing, src)
liftMaybe :: Maybe a -> TryFusion a
liftMaybe Nothing = fail "Nothing"
liftMaybe (Just x) = return x