1- {-# LANGUAGE GADTs #-}
1+ {-# LANGUAGE DataKinds #-}
2+ {-# LANGUAGE FlexibleInstances #-}
3+ {-# LANGUAGE GADTs #-}
4+ {-# LANGUAGE KindSignatures #-}
5+ {-# LANGUAGE MultiParamTypeClasses #-}
26module Development.IDE.Core.PluginUtils
37(-- * Wrapped Action functions
48 runActionE
@@ -82,31 +86,32 @@ runActionMT herald ide act =
8286 join $ shakeEnqueue (shakeExtras ide) (mkDelayedAction herald Logger. Debug $ runMaybeT act)
8387
8488-- | ExceptT version of `use` that throws a PluginRuleFailed upon failure
85- useE :: IdeRule k i v => k -> InputPath i -> ExceptT PluginError Action v
89+ useE :: ( IdeRule k i v , ToInputArg i a ) => k -> a -> ExceptT PluginError Action v
8690useE k = maybeToExceptT (PluginRuleFailed (T. pack $ show k)) . useMT k
8791
8892-- | MaybeT version of `use`
89- useMT :: IdeRule k i v => k -> InputPath i -> MaybeT Action v
90- useMT k = MaybeT . Shake. use k
93+ useMT :: ( IdeRule k i v , ToInputArg i a ) => k -> a -> MaybeT Action v
94+ useMT k = MaybeT . maybe ( pure Nothing ) ( Shake. use k) . toInputArg
9195
9296-- | ExceptT version of `uses` that throws a PluginRuleFailed upon failure
93- usesE :: (Traversable f , IdeRule k i v ) => k -> f ( InputPath i ) -> ExceptT PluginError Action (f v )
97+ usesE :: (Traversable f , IdeRule k i v , ToInputArg i a ) => k -> f a -> ExceptT PluginError Action (f v )
9498usesE k = maybeToExceptT (PluginRuleFailed (T. pack $ show k)) . usesMT k
9599
96100-- | MaybeT version of `uses`
97- usesMT :: (Traversable f , IdeRule k i v ) => k -> f ( InputPath i ) -> MaybeT Action (f v )
98- usesMT k xs = MaybeT $ sequence <$> Shake. uses k xs
101+ usesMT :: (Traversable f , IdeRule k i v , ToInputArg i a ) => k -> f a -> MaybeT Action (f v )
102+ usesMT k xs = MaybeT $ traverse toInputArg xs & maybe ( pure Nothing ) ( fmap sequence . Shake. uses k)
99103
100104-- | ExceptT version of `useWithStale` that throws a PluginRuleFailed upon
101105-- failure
102- useWithStaleE :: IdeRule k i v
103- => k -> InputPath i -> ExceptT PluginError Action (v , PositionMapping )
106+ useWithStaleE :: ( IdeRule k i v , ToInputArg i a )
107+ => k -> a -> ExceptT PluginError Action (v , PositionMapping )
104108useWithStaleE key = maybeToExceptT (PluginRuleFailed (T. pack $ show key)) . useWithStaleMT key
105109
106110-- | MaybeT version of `useWithStale`
107- useWithStaleMT :: IdeRule k i v
108- => k -> InputPath i -> MaybeT Action (v , PositionMapping )
109- useWithStaleMT key file = MaybeT $ runIdentity <$> Shake. usesWithStale key (Identity file)
111+ useWithStaleMT :: (IdeRule k i v , ToInputArg i a )
112+ => k -> a -> MaybeT Action (v , PositionMapping )
113+ useWithStaleMT key file =
114+ MaybeT $ maybe (pure Nothing ) (fmap runIdentity . Shake. usesWithStale key . Identity ) (toInputArg file)
110115
111116-- ----------------------------------------------------------------------------
112117-- IdeAction wrappers
@@ -122,12 +127,30 @@ runIdeActionMT _herald s i = MaybeT $ liftIO $ runReaderT (Shake.runIdeActionT $
122127
123128-- | ExceptT version of `useWithStaleFast` that throws a PluginRuleFailed upon
124129-- failure
125- useWithStaleFastE :: IdeRule k i v => k -> InputPath i -> ExceptT PluginError IdeAction (v , PositionMapping )
130+ useWithStaleFastE :: ( IdeRule k i v , ToInputArg i a ) => k -> a -> ExceptT PluginError IdeAction (v , PositionMapping )
126131useWithStaleFastE k = maybeToExceptT (PluginRuleFailed (T. pack $ show k)) . useWithStaleFastMT k
127132
128133-- | MaybeT version of `useWithStaleFast`
129- useWithStaleFastMT :: IdeRule k i v => k -> InputPath i -> MaybeT IdeAction (v , PositionMapping )
130- useWithStaleFastMT k = MaybeT . Shake. useWithStaleFast k
134+ useWithStaleFastMT :: (IdeRule k i v , ToInputArg i a ) => k -> a -> MaybeT IdeAction (v , PositionMapping )
135+ useWithStaleFastMT k = MaybeT . maybe (pure Nothing ) (Shake. useWithStaleFast k) . toInputArg
136+
137+ class ToInputArg (i :: InputClass ) a where
138+ toInputArg :: a -> Maybe (InputPath i )
139+
140+ instance ToInputArg i (InputPath i ) where
141+ toInputArg = Just
142+
143+ instance ToInputArg ProjectHaskellFiles NormalizedFilePath where
144+ toInputArg = toProjectHaskellInput
145+
146+ instance ToInputArg AllHaskellFiles NormalizedFilePath where
147+ toInputArg = Just . toAllHaskellInput
148+
149+ instance ToInputArg CabalFile NormalizedFilePath where
150+ toInputArg = toCabalFileInput
151+
152+ instance ToInputArg StackYaml NormalizedFilePath where
153+ toInputArg = toStackYamlInput
131154
132155-- ----------------------------------------------------------------------------
133156-- Location wrappers
0 commit comments