Commit Graph

54 Commits

Author SHA1 Message Date
Sandy Maguire
8aa10efa8a Release polysemy-plugin-0.2.4.0 2019-10-29 13:38:04 +01:00
Sandy Maguire
d46a5ddc5e Patch package.yaml from #267 2019-10-28 17:25:30 +01:00
Samuel Evans-Powell
95b4b5508c Feature/cabal doctest and ghc 8.8.1 (#267)
* Use cabal-doctest

- Haskell build tools run in slightly different environments (meaning different
  package databases are available).
- The nixpkgs build for polysemy-plugin is failing due to a missing package
  database, which causes the doctest to fail (more information here:
  https://github.com/NixOS/nixpkgs/issues/71164).
- By using cabal-doctest we can expose the Haskell packages required to the
  doctests no matter the build tool we're using.

* Use cabal-doctest in polysemy, build on GHC 8.8.1

- Use @googleson78 's changes to build polysemy on GHC 8.8.1, with slight
  modifications. The source distribution is now found in "dist-newstyle/sdist",
  so we've updated the command to point at that folder. Additionally, cabal
  v2-install doesn't support installing .tar.gz files in the same way v1-install
  did, so updated the command to use "cabal v1-install".
- Modified polysemy to use "cabal-doctest" and so overcome issues with the
  doctest tests (see issue #258, PR #265).
2019-10-28 17:13:44 +01:00
Sandy Maguire
c54a05fb3e Give a better error if polysemy can't be loaded by the plugin
Fixes #226
2019-10-23 15:48:08 +02:00
Sandy Maguire
b0a54f3bfa Run core-lint on the plugin tests 2019-10-09 14:51:03 +02:00
Sandy Maguire
a86aec37fb
Revert "Let plugin solve stuck type rows + bug fixes in interpreter mode (#245)" (#249)
This reverts commit 7a009f70b6.
2019-10-09 14:35:07 +02:00
Sandy Maguire
7a009f70b6
Let plugin solve stuck type rows + bug fixes in interpreter mode (#245)
In interpreter mode, the plugin used to see rows like State (Identity a) ': State a ': r, with an action in State a, and then incorrectly unify that thing with the first thing in the list State (Identity a). As a result, we'd ask for Identity a ~ a, which is infinite, and things would go wrong.

Now we instead collect all of the unifications we'd like to do, and only emit the most specific one, as measured by number of type constructors in it. This will now only emit a State (Identity a) ~ State (Identity s), and then unify the state we're looking for, plus the a ~ s that solves the other state action.

But the next problem is that we can't determine IndexOf in the row above, because a is a type variable, and so IndexOf is stuck, even though we know IndexOf that_row (State a) ~ 'S 'Z. So the plugin now also solves "stuck" IndexOfs of that form.

All of this means we can now happily introduce local effects that have type variables, for effects that are already known to be present in the row. And somehow it just works! Amazing!
2019-10-09 14:07:46 +02:00
Sandy Maguire
4ca15a22e5 Release polysemy-plugin-0.2.3.0 2019-09-04 11:19:39 -07:00
KingoftheHomeless
7bda143878
polysemy-plugin: Reject ununifiable effect candidates early (#221)
* polysemy-plugin: Reject ununifiable effect candidates early

* Bump version, update changelog, expand tests
2019-09-04 17:11:01 +02:00
KingoftheHomeless
4a5f2ce92a
Add Final Effect (#217)
* Add Final Effect

* Changes per review, Final at top-level, doc changes

* Update Changelog

* Final touches to Final

* Revert change to stack.yaml
2019-08-30 22:38:53 +02:00
Sandy Maguire
de1607ea1b
Rename everything and its grandmother (#175) 2019-07-15 12:40:42 -04:00
Georgi Lyubenov
48b6768ad4 Rename Lift to Embed (#161)
* Move Polysemy.Internal.Lift to Polysemy.Lift.Type

* Add Polysemy.Lift module and runLift interpreter

* Add a Sandy reminder

* Add explicit foralls and split type signature

* Fix import spacing, for there is no "qualified"

* Implement runIO in terms of runLift

* Rename Lift -> Embed

* Replace sendM with embed

* Add a Sandy todo for embed version

* Rename runEmbed and related runEmbedded (from IO)

* runEmbedded -> runEmbeddedInIO
* runEmbed -> runEmbedded

* Update cabal
2019-07-11 11:02:26 -04:00
TheMatten
ec03b04e8e Fix ambiguously looking variables in smart constructors, refactor Polysemy.Internal.TH.Common 2019-07-08 21:52:29 +02:00
Sandy Maguire
f259f8ae78
Cleanup and document fundep plugin (#155)
I made the code style agree with the rest of the codebase, and I wrote down everything I know about how this works.
2019-07-05 14:14:45 -04:00
Sandy Maguire
83c1c20242 Release polysemy-plugin-0.2.2.0 2019-07-04 22:06:19 -04:00
Sandy Maguire
9e586eaeab
Redefine Type.Errors directly in polysemy (#153)
Fixes #152
2019-07-04 16:09:36 -04:00
Sandy Maguire
ef5ff1749a
Don't emit ambiguous effect errors for genuine type errors (#149)
This PR changes the plugin so it will notice an insoluble constraint of the form Sem r a ~ Foo, and mark that r takes part in a genuine type error. The plugin will then provide a bogus evidence term for IfStuck (IndexOf r _) _ _, which prevents the AmbiguousSend error message from firing.
2019-07-04 09:35:33 -04:00
TheMatten
8bbd9dc7d6 Use new, separate loopbreaker library for inlining (#145)
* Remove explicit loopbreakers, enable plugin

* Use uploaded version of `loopbreaker`

* Fix span of macro

* Disable plugin on GHC <8.6

* Add comment about use of plugin

* Separate unrelated conditions
2019-07-01 02:13:37 -04:00
Sandy Maguire
d2c8131cb8 Fix plugin badge 2019-06-26 10:23:06 -04:00
Sandy Maguire
6ca5b4f428 Release polysemy-plugin-0.2.1.1 2019-06-26 10:21:15 -04:00
Sandy Maguire
2654d35066
Forklift interpretations (#128)
This PR provides a single function withLowerToIO, which runs a desired Sem r effect all the way down to IO, without needing to know the natural transformation beforehand. It does it by running the desired code in a new thread, and shipping all of the unhandled effects back to the main thread. The main thread turns into an event loop for the duration of the withLowerToIO block.
2019-06-25 23:46:54 -04:00
Sandy Maguire
29216ceb69
Improve CI coverage -- now on GHC 8.4! (#39) 2019-06-19 17:25:37 -04:00
Sandy Maguire
6ffb4fd282
Remove Effect class (#118)
This thing was a vestige of the bad old days when you had to write
*instances* of classes things in Polysemy. It was a terrible experience,
and so we don't do that anymore. As a result, the only two instances of
`Effect` were for `Union` and `Yo` --- so I just inlined them.
2019-06-17 15:16:28 -04:00
Sandy Maguire
0a1ce2b837 Add hspec-discover to package build-tools
Fixes #111
2019-06-15 20:12:18 -04:00
Sandy Maguire
82f86add29
Custom type error testing (#113)
This PR adds doctests allowing us to write tests for the custom type errors. Having this stuff reified in the test suite means we can iterate on the implementations and give much better QA.
2019-06-15 20:04:11 -04:00
Sandy Maguire
b5d086b859 Release polysemy-plugin 0.2.1.0 2019-06-14 11:38:47 -04:00
Sandy Maguire
e90c745d7a
Allow bidirectional typechecking in the plugin (#105)
* Allow bidirectional typechecking in the plugin

The plugin used to choke on this:

```haskell
flipShouldBe 11 . sum . fst . run . runFoldMapOutput id $ do
  output [1]
  output $ replicate 2 5
```

because it would fail to unify `Output (t Int)` (the polymorphic
`Traversable` variable in `sum`) with `Output [Int]`.

In this case, there are no given constraints, so the plugin is
attempting to solve a `Member (Output (t Int)) '[Output [Int]]`. We
reuse the codepath for unifying wanted/givens, pretending like the
`Output (t Int)` is a given.[^1]

[^1]: Pretending it's a wanted breaks something else that I don't
remember right now. This code is brittle :(

So now we have a "wanted" `Output [Int]`, and a "given" `Output (t
Int)`. In general, this thing isn't OK to solve. Consider a real
example:

```haskell
foo :: Member (Output (t Int)) r => Sem r ()
foo = output [5]
```

This is a type error, because the polymorphism goes the wrong way. We
have no guarantees that `t` is supposed to be `[]`.

But in our original example, this isn't a problem, because our `t` isn't
actually in given position. It's just an artifact of reusing the code!
`mkWanted` now takes a new parameter for whether or not it's OK to allow
the givens to be polymorphic.

Such a thing necessitates a change though. We never want to unify
a polymorphic *effect* in given position. Doing so will break Haskell's
regular type inference that determines what the effect row should be,
based on the order in which the interpreters are run.
2019-06-14 11:28:14 -04:00
Sandy Maguire
18e16f68db Release polysemy-plugin 0.2.0.3 2019-06-13 15:39:57 -04:00
Sandy Maguire
fc88a961ad
Ensure wanted constraints are emitted only once. (#102)
* Ensure wanted constraints are emitted only once.

This is a fix for the "solveSimpleWanteds: too many iterations" problem
that people are running into. In these cases, the plugin is being asked
to solve the same `Member` constraint several times, and generating
a new wanted each time. In doing so, GHC thinks that work was done, so
it will ask the plugin to run again next time. This process diverges,
and produces the error.

Fixes #79
2019-06-13 14:39:49 -04:00
Sandy Maguire
b7f2922c3a
Better Resource bracketing (#87) 2019-06-12 09:36:08 -04:00
Sandy Maguire
4ca49cba2b Ensure polysemy-plugin's package.yaml is correct 2019-06-12 09:32:09 -04:00
Silvan Mosberger
979413a5e1 Update polysemy-plugin version bound (#100)
The test suite is made for 0.3 and doesn't compile with earlier versions
due to Yo now taking another argument since
https://github.com/isovector/polysemy/pull/71
2019-06-11 18:47:57 -04:00
Sandy Maguire
1813b53750 Release polysemy-plugin 0.2.0.2 2019-06-09 00:27:18 -04:00
Sandy Maguire
66be47036d
Perform recursive unification attempts in the plugin (#96) 2019-06-09 00:20:23 -04:00
Sandy Maguire
f5dcbe3c98
Fixes #54 (#85) 2019-06-05 09:44:34 -04:00
Sandy Maguire
0f41b3fddf Test for #47 2019-06-05 03:44:31 -04:00
Sandy Maguire
e41b73bb55 Unnecessary import 2019-06-01 16:30:33 -04:00
Sandy Maguire
63b1f4257f
GetInspectorT (#71)
* Evacuation wip

* Two other uses of weave

* Evacuator -> Inspector

* Inspector test
2019-05-31 00:06:46 -04:00
Sandy Maguire
8dfafb9b75 Release plugin version 0.2.0.1 2019-05-28 15:52:53 -04:00
Sandy Maguire
7cc2f8c567 Fix #68 2019-05-28 15:48:03 -04:00
Sandy Maguire
b6f16e762b Add runErrorAsAnother 2019-05-27 01:39:14 -04:00
Sandy Maguire
ad42c75fcf Release polysemy 0.2.1.0 2019-05-27 01:16:14 -04:00
Sandy Maguire
09ca7b9233 Release polysemy-plugin-0.2.0.0 2019-05-23 17:06:24 -04:00
Sandy Maguire
feacd2a001
Fix the plugin (#62) 2019-05-23 17:05:32 -04:00
Sandy Maguire
ff222d826a
Automatically inline recursive calls in the plugin (#52)
* Inline recursive calls + bonus passes for inlining

* Broken inspection test

* Bug in inspection testing

* Deprecate inlineRecursiveCalls

* Move inlineRecursiveCalls into the deprecated section
2019-05-20 02:15:18 -04:00
Sandy Maguire
71001dc049 Split out fundep part of plugin 2019-05-19 23:02:08 -04:00
Sandy Maguire
76d5f1953e
Release 0.1.2.1 (#51) 2019-05-18 11:42:14 -04:00
Sandy Maguire
b5ea9ae0fd guard todos on GHC 8.0.10 2019-05-16 16:16:08 -04:00
Sandy Maguire
2cfd3692f2 Let plugin know when to improve performance 2019-05-16 15:26:18 -04:00
Sandy Maguire
c3e13cadc7 Let plugin deal with incorrect polymorphism 2019-05-01 15:13:51 -04:00