packages feed

hls-graph-1.4.0.0: src/Development/IDE/Graph/Internal/Action.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TypeFamilies               #-}

module Development.IDE.Graph.Internal.Action where

import           Control.Exception
import           Control.Monad.Fail
import           Control.Monad.IO.Class
import qualified Development.Shake         as Shake
import           Development.Shake.Classes
import qualified Development.Shake.Rule    as Shake

newtype Action a = Action {fromAction :: Shake.Action a}
    deriving (Monad, Applicative, Functor, MonadIO, MonadFail)

alwaysRerun :: Action ()
alwaysRerun = Action Shake.alwaysRerun

reschedule :: Double -> Action ()
reschedule = Action . Shake.reschedule

parallel :: [Action a] -> Action [a]
parallel = Action . Shake.parallel . map fromAction

actionCatch :: Exception e => Action a -> (e -> Action a) -> Action a
actionCatch a b = Action $ Shake.actionCatch (fromAction a) (fromAction . b)

actionBracket :: IO a -> (a -> IO b) -> (a -> Action c) -> Action c
actionBracket a b c = Action $ Shake.actionBracket a b (fromAction . c)

actionFinally :: Action a -> IO b -> Action a
actionFinally a b = Action $ Shake.actionFinally (fromAction a) b

apply1 :: (Shake.RuleResult key ~ value, Shake.ShakeValue key, Typeable value) => key -> Action value
apply1 = Action . Shake.apply1

apply :: (Shake.RuleResult key ~ value, Shake.ShakeValue key, Typeable value) => [key] -> Action [value]
apply = Action . Shake.apply