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

module Development.IDE.Graph.Internal.Rules where

import qualified Development.Shake as Shake
import qualified Development.Shake.Rule as Shake
import Development.Shake.Classes
import Development.IDE.Graph.Internal.Action
import Control.Monad.IO.Class
import Control.Monad.Fail
import qualified Data.ByteString as BS

newtype Rules a = Rules {Rules a -> Rules a
fromRules :: Shake.Rules a}
    deriving (Semigroup (Rules a)
Rules a
Semigroup (Rules a)
-> Rules a
-> (Rules a -> Rules a -> Rules a)
-> ([Rules a] -> Rules a)
-> Monoid (Rules a)
[Rules a] -> Rules a
Rules a -> Rules a -> Rules a
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall a. Monoid a => Semigroup (Rules a)
forall a. Monoid a => Rules a
forall a. Monoid a => [Rules a] -> Rules a
forall a. Monoid a => Rules a -> Rules a -> Rules a
mconcat :: [Rules a] -> Rules a
$cmconcat :: forall a. Monoid a => [Rules a] -> Rules a
mappend :: Rules a -> Rules a -> Rules a
$cmappend :: forall a. Monoid a => Rules a -> Rules a -> Rules a
mempty :: Rules a
$cmempty :: forall a. Monoid a => Rules a
$cp1Monoid :: forall a. Monoid a => Semigroup (Rules a)
Monoid, b -> Rules a -> Rules a
NonEmpty (Rules a) -> Rules a
Rules a -> Rules a -> Rules a
(Rules a -> Rules a -> Rules a)
-> (NonEmpty (Rules a) -> Rules a)
-> (forall b. Integral b => b -> Rules a -> Rules a)
-> Semigroup (Rules a)
forall b. Integral b => b -> Rules a -> Rules a
forall a. Semigroup a => NonEmpty (Rules a) -> Rules a
forall a. Semigroup a => Rules a -> Rules a -> Rules a
forall a b. (Semigroup a, Integral b) => b -> Rules a -> Rules a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: b -> Rules a -> Rules a
$cstimes :: forall a b. (Semigroup a, Integral b) => b -> Rules a -> Rules a
sconcat :: NonEmpty (Rules a) -> Rules a
$csconcat :: forall a. Semigroup a => NonEmpty (Rules a) -> Rules a
<> :: Rules a -> Rules a -> Rules a
$c<> :: forall a. Semigroup a => Rules a -> Rules a -> Rules a
Semigroup, Applicative Rules
a -> Rules a
Applicative Rules
-> (forall a b. Rules a -> (a -> Rules b) -> Rules b)
-> (forall a b. Rules a -> Rules b -> Rules b)
-> (forall a. a -> Rules a)
-> Monad Rules
Rules a -> (a -> Rules b) -> Rules b
Rules a -> Rules b -> Rules b
forall a. a -> Rules a
forall a b. Rules a -> Rules b -> Rules b
forall a b. Rules a -> (a -> Rules b) -> Rules b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> Rules a
$creturn :: forall a. a -> Rules a
>> :: Rules a -> Rules b -> Rules b
$c>> :: forall a b. Rules a -> Rules b -> Rules b
>>= :: Rules a -> (a -> Rules b) -> Rules b
$c>>= :: forall a b. Rules a -> (a -> Rules b) -> Rules b
$cp1Monad :: Applicative Rules
Monad, Functor Rules
a -> Rules a
Functor Rules
-> (forall a. a -> Rules a)
-> (forall a b. Rules (a -> b) -> Rules a -> Rules b)
-> (forall a b c. (a -> b -> c) -> Rules a -> Rules b -> Rules c)
-> (forall a b. Rules a -> Rules b -> Rules b)
-> (forall a b. Rules a -> Rules b -> Rules a)
-> Applicative Rules
Rules a -> Rules b -> Rules b
Rules a -> Rules b -> Rules a
Rules (a -> b) -> Rules a -> Rules b
(a -> b -> c) -> Rules a -> Rules b -> Rules c
forall a. a -> Rules a
forall a b. Rules a -> Rules b -> Rules a
forall a b. Rules a -> Rules b -> Rules b
forall a b. Rules (a -> b) -> Rules a -> Rules b
forall a b c. (a -> b -> c) -> Rules a -> Rules b -> Rules c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: Rules a -> Rules b -> Rules a
$c<* :: forall a b. Rules a -> Rules b -> Rules a
*> :: Rules a -> Rules b -> Rules b
$c*> :: forall a b. Rules a -> Rules b -> Rules b
liftA2 :: (a -> b -> c) -> Rules a -> Rules b -> Rules c
$cliftA2 :: forall a b c. (a -> b -> c) -> Rules a -> Rules b -> Rules c
<*> :: Rules (a -> b) -> Rules a -> Rules b
$c<*> :: forall a b. Rules (a -> b) -> Rules a -> Rules b
pure :: a -> Rules a
$cpure :: forall a. a -> Rules a
$cp1Applicative :: Functor Rules
Applicative, a -> Rules b -> Rules a
(a -> b) -> Rules a -> Rules b
(forall a b. (a -> b) -> Rules a -> Rules b)
-> (forall a b. a -> Rules b -> Rules a) -> Functor Rules
forall a b. a -> Rules b -> Rules a
forall a b. (a -> b) -> Rules a -> Rules b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Rules b -> Rules a
$c<$ :: forall a b. a -> Rules b -> Rules a
fmap :: (a -> b) -> Rules a -> Rules b
$cfmap :: forall a b. (a -> b) -> Rules a -> Rules b
Functor, Monad Rules
Monad Rules -> (forall a. IO a -> Rules a) -> MonadIO Rules
IO a -> Rules a
forall a. IO a -> Rules a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> Rules a
$cliftIO :: forall a. IO a -> Rules a
$cp1MonadIO :: Monad Rules
MonadIO, Monad Rules
Monad Rules -> (forall a. String -> Rules a) -> MonadFail Rules
String -> Rules a
forall a. String -> Rules a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
fail :: String -> Rules a
$cfail :: forall a. String -> Rules a
$cp1MonadFail :: Monad Rules
MonadFail)

action :: Action a -> Rules ()
action :: Action a -> Rules ()
action = Rules () -> Rules ()
forall a. Rules a -> Rules a
Rules (Rules () -> Rules ())
-> (Action a -> Rules ()) -> Action a -> Rules ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Action a -> Rules ()
forall a. Partial => Action a -> Rules ()
Shake.action (Action a -> Rules ())
-> (Action a -> Action a) -> Action a -> Rules ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Action a -> Action a
forall a. Action a -> Action a
fromAction

addRule
    :: (Shake.RuleResult key ~ value, Shake.ShakeValue key, Typeable value, NFData value, Show value)
    => (key -> Maybe BS.ByteString -> Shake.RunMode -> Action (Shake.RunResult value))
    -> Rules ()
addRule :: (key -> Maybe ByteString -> RunMode -> Action (RunResult value))
-> Rules ()
addRule key -> Maybe ByteString -> RunMode -> Action (RunResult value)
f = Rules () -> Rules ()
forall a. Rules a -> Rules a
Rules (Rules () -> Rules ()) -> Rules () -> Rules ()
forall a b. (a -> b) -> a -> b
$ BuiltinLint key value
-> BuiltinIdentity key value -> BuiltinRun key value -> Rules ()
forall key value.
(RuleResult key ~ value, ShakeValue key, Typeable value,
 NFData value, Show value, Partial) =>
BuiltinLint key value
-> BuiltinIdentity key value -> BuiltinRun key value -> Rules ()
Shake.addBuiltinRule BuiltinLint key value
forall key value. BuiltinLint key value
Shake.noLint BuiltinIdentity key value
forall key value. BuiltinIdentity key value
Shake.noIdentity (BuiltinRun key value -> Rules ())
-> BuiltinRun key value -> Rules ()
forall a b. (a -> b) -> a -> b
$ \key
k Maybe ByteString
bs RunMode
r -> Action (RunResult value) -> Action (RunResult value)
forall a. Action a -> Action a
fromAction (Action (RunResult value) -> Action (RunResult value))
-> Action (RunResult value) -> Action (RunResult value)
forall a b. (a -> b) -> a -> b
$ key -> Maybe ByteString -> RunMode -> Action (RunResult value)
f key
k Maybe ByteString
bs RunMode
r