hls-tactics-plugin-0.5.1.0: src/Ide/Plugin/Tactic/KnownStrategies.hs
{-# LANGUAGE LambdaCase #-}
module Ide.Plugin.Tactic.KnownStrategies where
import Control.Monad.Error.Class
import Ide.Plugin.Tactic.Context (getCurrentDefinitions)
import Ide.Plugin.Tactic.Tactics
import Ide.Plugin.Tactic.Types
import OccName (mkVarOcc)
import Refinery.Tactic
import Ide.Plugin.Tactic.Machinery (tracing)
import Ide.Plugin.Tactic.KnownStrategies.QuickCheck (deriveArbitrary)
knownStrategies :: TacticsM ()
knownStrategies = choice
[ known "fmap" deriveFmap
, known "arbitrary" deriveArbitrary
]
known :: String -> TacticsM () -> TacticsM ()
known name t = do
getCurrentDefinitions >>= \case
[(def, _)] | def == mkVarOcc name ->
tracing ("known " <> name) t
_ -> throwError NoApplicableTactic
deriveFmap :: TacticsM ()
deriveFmap = do
try intros
overAlgebraicTerms homo
choice
[ overFunctions apply >> auto' 2
, assumption
, recursion
]