{-# LANGUAGE ExistentialQuantification #-} module Development.IDE.Types.Shake (Value(..), Values, Key(..), currentValue) where import Control.DeepSeq import Data.Dynamic import Data.Hashable import Data.HashMap.Strict import Data.Typeable import GHC.Generics import Language.Haskell.LSP.Types data Value v = Succeeded TextDocumentVersion v | Stale TextDocumentVersion v | Failed deriving (Functor, Generic, Show) instance NFData v => NFData (Value v) -- | Convert a Value to a Maybe. This will only return `Just` for -- up2date results not for stale values. currentValue :: Value v -> Maybe v currentValue (Succeeded _ v) = Just v currentValue (Stale _ _) = Nothing currentValue Failed = Nothing -- | The state of the all values. type Values = HashMap (NormalizedFilePath, Key) (Value Dynamic) -- | Key type data Key = forall k . (Typeable k, Hashable k, Eq k, Show k) => Key k instance Show Key where show (Key k) = show k instance Eq Key where Key k1 == Key k2 | Just k2' <- cast k2 = k1 == k2' | otherwise = False instance Hashable Key where hashWithSalt salt (Key key) = hashWithSalt salt (typeOf key, key)