-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Disambiguate obvious uses of effects. -- -- Please see the README on GitHub at -- https://github.com/isovector/polysemy/tree/master/polysemy-plugin#readme @package polysemy-plugin @version 0.2.4.0 module Polysemy.Plugin.Fundep.Stuff -- | All of the things from "polysemy" that we need access to in the -- plugin. When l ~ 'Locations, each of these is just a pair of -- strings. When l ~ 'Things, it's actually references to the -- stuff. data PolysemyStuff (l :: LookupState) PolysemyStuff :: ThingOf l Class -> ThingOf l TyCon -> ThingOf l TyCon -> ThingOf l TyCon -> PolysemyStuff [findClass] :: PolysemyStuff -> ThingOf l Class [semTyCon] :: PolysemyStuff -> ThingOf l TyCon [ifStuckTyCon] :: PolysemyStuff -> ThingOf l TyCon [indexOfTyCon] :: PolysemyStuff -> ThingOf l TyCon -- | Data kind for ThingOf. data LookupState Locations :: LookupState Things :: LookupState -- | Lookup all of the PolysemyStuff. polysemyStuff :: TcPluginM (PolysemyStuff 'Things) instance Polysemy.Plugin.Fundep.Stuff.CanLookup Class.Class instance Polysemy.Plugin.Fundep.Stuff.CanLookup TyCon.TyCon module Polysemy.Plugin.Fundep.Unification -- | The context in which we're attempting to solve a constraint. data SolveContext -- | In the context of a function definition. FunctionDef :: SolveContext -- | In the context of running an interpreter. The Bool corresponds -- to whether we are only trying to solve a single Member -- constraint right now. If so, we *must* produce a unification wanted. InterpreterUse :: Bool -> SolveContext -- | Depending on the context in which we're solving a constraint, we may -- or may not want to force a unification of effects. For example, when -- defining user code whose type is Member (State Int) r => -- ..., if we see get :: Sem r s, we should unify s ~ -- Int. mustUnify :: SolveContext -> Bool -- | Determine whether or not two effects are unifiable. This is nuanced. -- -- There are several cases: -- --
-- foo :: Member (State Int) r => Sem r () -- foo = put 10 ---- -- What does this program do? Any human will tell you that it changes the -- state of the Int to 10, which is clearly what's meant. -- -- Unfortunately, Polysemy can't work this out on its own. Its reasoning -- is "maybe you wanted to change some other State effect which is -- also a Num, but you just forgot to add a Member -- constraint for it." -- -- This is obviously insane, but it's the way the cookie crumbles. -- Plugin is a typechecker plugin which will disambiguate the -- above program (and others) so the compiler will do what you want. -- -- Usage: -- -- Add the following line to your package configuration: -- --
-- ghc-options: -fplugin=Polysemy.Plugin ---- -- Limitations: -- -- The Plugin will only disambiguate effects if there is exactly -- one relevant constraint in scope. For example, it will not -- disambiguate the following program: -- --
-- bar :: Members '[ State Int -- , State Double -- ] r => Sem r () -- bar = put 10 ---- -- because it is now unclear whether you're attempting to set the -- Int or the Double. Instead, you can manually write a -- type application in this case. -- --
-- bar :: Members '[ State Int -- , State Double -- ] r => Sem r () -- bar = put @Int 10 --module Polysemy.Plugin plugin :: Plugin module Polysemy.Plugin.Phases extraPhases :: DynFlags -> [CoreToDo]