{-# LANGUAGE ExistentialQuantification #-}
module Development.IDE.Graph.Database(
    Shake.ShakeDatabase,
    SomeShakeValue(..),
    shakeOpenDatabase,
    shakeRunDatabaseForKeys,
    Shake.shakeProfileDatabase,
    ) where

import           Data.Typeable
import           Development.IDE.Graph.Internal.Action
import           Development.IDE.Graph.Internal.Options
import           Development.IDE.Graph.Internal.Rules
import           Development.Shake                      (ShakeValue)
import           Development.Shake.Classes
import qualified Development.Shake.Database             as Shake

shakeOpenDatabase :: ShakeOptions -> Rules () -> IO (IO Shake.ShakeDatabase, IO ())
shakeOpenDatabase :: ShakeOptions -> Rules () -> IO (IO ShakeDatabase, IO ())
shakeOpenDatabase ShakeOptions
a Rules ()
b = ShakeOptions -> Rules () -> IO (IO ShakeDatabase, IO ())
Shake.shakeOpenDatabase (ShakeOptions -> ShakeOptions
fromShakeOptions ShakeOptions
a) (Rules () -> Rules ()
forall a. Rules a -> Rules a
fromRules Rules ()
b)

data SomeShakeValue = forall k . ShakeValue k => SomeShakeValue k
instance Eq SomeShakeValue where SomeShakeValue k
a == :: SomeShakeValue -> SomeShakeValue -> Bool
== SomeShakeValue k
b = k -> Maybe k
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast k
a Maybe k -> Maybe k -> Bool
forall a. Eq a => a -> a -> Bool
== k -> Maybe k
forall a. a -> Maybe a
Just k
b
instance Hashable SomeShakeValue where hashWithSalt :: Int -> SomeShakeValue -> Int
hashWithSalt Int
s (SomeShakeValue k
x) = Int -> k -> Int
forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
s k
x
instance Show SomeShakeValue where show :: SomeShakeValue -> String
show (SomeShakeValue k
x) = k -> String
forall a. Show a => a -> String
show k
x

shakeRunDatabaseForKeys
    :: Maybe [SomeShakeValue]
      -- ^ Set of keys changed since last run. 'Nothing' means everything has changed
    -> Shake.ShakeDatabase
    -> [Action a]
    -> IO ([a], [IO ()])
shakeRunDatabaseForKeys :: Maybe [SomeShakeValue]
-> ShakeDatabase -> [Action a] -> IO ([a], [IO ()])
shakeRunDatabaseForKeys Maybe [SomeShakeValue]
_keys ShakeDatabase
a [Action a]
b =
    -- Shake upstream does not accept the set of keys changed yet
    -- https://github.com/ndmitchell/shake/pull/802
    ShakeDatabase -> [Action a] -> IO ([a], [IO ()])
forall a. ShakeDatabase -> [Action a] -> IO ([a], [IO ()])
Shake.shakeRunDatabase ShakeDatabase
a ((Action a -> Action a) -> [Action a] -> [Action a]
forall a b. (a -> b) -> [a] -> [b]
map Action a -> Action a
forall a. Action a -> Action a
fromAction [Action a]
b)