Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-export Foldable1 and Bifoldable1 from base-4.18 (GHC 9.6) #130

Closed
RyanGlScott opened this issue Jan 22, 2023 · 41 comments · Fixed by #132
Closed

Re-export Foldable1 and Bifoldable1 from base-4.18 (GHC 9.6) #130

RyanGlScott opened this issue Jan 22, 2023 · 41 comments · Fixed by #132

Comments

@RyanGlScott
Copy link
Collaborator

RyanGlScott commented Jan 22, 2023

base-4.18.0.0 (bundled with GHC 9.6) implements this CLC proposal (see this GHC commit), which adds semigroupoids' Foldable1 and Bifoldable1 classes to base. We should re-export these classes when building with a sufficiently new version of base, and provide backported versions of these classes when building with older versions of base. Note that the API of these classes in base have changed somewhat from their current form in semigroupoids, so we will need to make some API changes on the semigroupoids end.

After doing this, we can close the following issues, as they are now base issues rather than semigroupoids issues:

It would also resolve some parts of #26, but there are certainly other parts of semigroupoids to bikeshed besides Foldable1 and Bifoldable1.

@Bodigrim
Copy link

I think the plan was to release https://github.com/phadej/foldable1 as a compatibility shim, then make semigroupoids to depend on base or foldable1 depending on base version. CC @phadej.

@phadej
Copy link
Contributor

phadej commented Jan 23, 2023

I'll be happy if someone takes over foldable1, maybe haskell-compat organization. CLC should probably coordinate with M Farkas-Dyck whether the name can still be donated, or whether the (small) compat package has to be released under different name.

@phadej
Copy link
Contributor

phadej commented Jan 23, 2023

EDIT: I guess it can, as foldable1 on Hackage doesn't have any maintainers: https://hackage.haskell.org/package/foldable1/maintainers/ (which is weird!?)

@RyanGlScott
Copy link
Collaborator Author

I don't have a strong opinion on whether to put the compatibility shims into semigroupoids or into a separate package like foldable1. That being said, I'm very unclear on what the process would be for taking over an already-released-to-Hackage library such as foldable1, which gives me pause.

@phadej
Copy link
Contributor

phadej commented Jan 23, 2023

That being said, I'm very unclear on what the process would be for taking over an already-released-to-Hackage library such as foldable1, which gives me pause.

I'd say that's something CLC should arrange together with Hackage admins.

@strake donated the name for the cause in 2019: https://mail.haskell.org/pipermail/libraries/2019-October/030029.html

@Bodigrim asked @strake to confirm whether that's offer still stands in 2021 in haskell/core-libraries-committee#9 (comment) but AFAICS didn't got a confirmation (nor prohibition!)

But as said, foldable1 doesn't have a maintainer anymore (which is weird). I think hackage admins can see an audit log showing when (and who) modified the maintainers group of foldable1. Also foldable1 is marked as deprecated.

So I don't see a road block for taking over the package name. One can of course be polite and ask once more, but OTOH if @strake removed themselves from a maintainer group and deprecated the package, I'd say that the offer made in 2019 still stands.

@Bodigrim
Copy link

It would be better to have a separate shim package so that users who are interested in Foldable1, but do not want to depend on semigroupoids could do so without compromising GHC support range.

I assume that @strake deprecated the package and stepped down as a maintainer (leaving the package without any active maintainers), so it should be fine to take over. If someone is serious about maintaining a compatibility package, I'd be happy to assist asking Matthew again and helping with admin matters.

@RyanGlScott
Copy link
Collaborator Author

I think https://github.com/phadej/foldable1 would be a good candidate for a shim package. @phadej, would you be willing to transfer ownership of that repository to the haskell-compat organization?

@Bodigrim, is the package takeover process described here up to date? If so, I can initiate it by emailing @strake.

@Bodigrim
Copy link

@Bodigrim, is the package takeover process described here up to date? If so, I can initiate it by emailing @strake.

Yes, it's up to date; thanks.

@phadej
Copy link
Contributor

phadej commented Jan 24, 2023

@phadej, would you be willing to transfer ownership of that repository to the haskell-compat organization?

Sure.

@RyanGlScott
Copy link
Collaborator Author

Thanks, @phadej! Let me know if I can help with anything transfer-wise.

@phadej
Copy link
Contributor

phadej commented Jan 25, 2023

@RyanGlScott I'll first transfer it to you, as IIRC one needs to be an admin of org to transfer the repositories there.

@phadej
Copy link
Contributor

phadej commented Jan 25, 2023

@RyanGlScott and also it might be required to move Bifoldable1 to bifunctors as that class depends on Bifoldable and you might end up with a package dependency circle. At least I'd prefer foldable1 not to depend on bifunctors (and stuff bifunctors depends).

(Say if indexed-traversable would like to introduce Foldable1WithIndex.)

@RyanGlScott
Copy link
Collaborator Author

A very good point. I can see how bifunctors' current set of dependencies would be problematic. Moving Bifoldable1 to the bifunctors library would avoid this issue for anyone who only wants to use the Foldable1 class, but the issue would still be there for those who want to use the Bifoldable1 class. This means that we still run into the same issues that @Bodigrim is getting at in #130 (comment), albeit in slightly more limited fashion.

Really, I think the issue is that the bifunctors library is trying to be a compatibility package, but it does a poor job of doing so. In addition to providing backported versions of Bifunctor, Bifoldable, and Bitraversable, the bifunctors library also provides a wide variety of extra bells and whistles that do not have anything to do with compatibility purposes. These include:

  • Tannen (which brings in a comonad dependency)
  • TH derivation (which brings in a template-haskell and th-abstraction dependency)

If you were to strip away all of this extra functionality, however, then bifunctors' dependencies would be the same as foldable1's. To me, this suggests that there is a smaller package lurking beneath the surface. I propose that we:

  • Factor out the Data.Bifunctor, Data.Bifoldable, and Data.Bitraversable compatibility modules from bifunctors and put them in their own package. I'll tentatively call this package bifunctor-classes-compat.
  • Update bifunctors to depend on (and re-export the modules from) bifunctor-classes-compat.
  • Have foldable1 depend on bifunctor-classes-compat.

Does this sound reasonable? If we wanted to, we could even rename the foldable1 library to foldable1-classes-compat for symmetry with bifunctor-classes-compat. This would have a secondary advantage: we could upload it to Hackage without needing to take over the existing foldable1 library on Hackage.

@phadej
Copy link
Contributor

phadej commented Jan 26, 2023

That's an option too.

For some reason I'd still rather put Bifoldable1 into bifunctor-classes-compat, but I guess it doesn't really make a difference.

EDIT: A benefit of having Bifoldable1 in foldable1-classes-compat is that bifunctor-classes-compat would be very much unused (as lower bounds for many stuff is starting to be over GHC-8.2+)

@RyanGlScott
Copy link
Collaborator Author

I favor putting Bifoldable1 in foldable1-classes-compat, since:

  1. As you mentioned in your edit to Re-export Foldable1 and Bifoldable1 from base-4.18 (GHC 9.6) #130 (comment), foldable1-classes-compat will only incur an extra bifunctor-classes-compat dependency if building with GHC 8.0 or older, so recent GHCs (the more common case) won't incur any extra dependencies.
  2. I like the idea of putting Foldable1 and Bifoldable1 together into the same compatibility package, since they were also introduced into base at the same time.

@phadej
Copy link
Contributor

phadej commented Jan 26, 2023

I was thinking what happens if e.g. Biapplicative migrates to base as well. I guess nothing drastic.

  • the pain of that migration will be in bifunctors / bifunctor-classes-compat (whether the class will be moved or not).
  • foldable1-classes-compat won't need to change as it doesn't care where is Biapplicative, as it doesn't use it.

There might be very distant, "what if Bitraversable1 migrates to base", but it's so distant (and may never happen) that it may not be our problem to think about (and e.g. foldable1 or atleast bifunctor-classes-compat may be obsolete by then :) )

@RyanGlScott
Copy link
Collaborator Author

Indeed, classes migrating from the Kmettiverse to base is a pretty uncommon occurrence. I'm inclined not to worry about this for now.

RyanGlScott added a commit to ekmett/bifunctors that referenced this issue Jan 27, 2023
This moves all of the compatibility modules in `bifunctors` (`Data.Bifunctor`,
`Data.Bifoldable`, and `Data.Bitraversable`) to a new
`bifunctor-classes-compat` package. This package has fewer dependencies than
`bifunctors` proper.  This is one step towards being able to use `Bifunctor` in
an upcoming `foldable1-classes-compat` compatibility package. See
ekmett/semigroupoids#130.

This is purely a refactoring, and there should be no change in user-visible
behavior.
RyanGlScott added a commit to ekmett/bifunctors that referenced this issue Jan 27, 2023
This moves all of the compatibility modules in `bifunctors` (`Data.Bifunctor`,
`Data.Bifoldable`, and `Data.Bitraversable`) to a new
`bifunctor-classes-compat` package. This package has fewer dependencies than
`bifunctors` proper.  This is one step towards being able to use `Bifunctor` in
an upcoming `foldable1-classes-compat` compatibility package. See
ekmett/semigroupoids#130.

This is purely a refactoring, and there should be no change in user-visible
behavior.
RyanGlScott added a commit to ekmett/bifunctors that referenced this issue Jan 27, 2023
This moves all of the compatibility modules in `bifunctors` (`Data.Bifunctor`,
`Data.Bifoldable`, and `Data.Bitraversable`) to a new
`bifunctor-classes-compat` package. This package has fewer dependencies than
`bifunctors` proper.  This is one step towards being able to use `Bifunctor` in
an upcoming `foldable1-classes-compat` compatibility package. See
ekmett/semigroupoids#130.

This is purely a refactoring, and there should be no change in user-visible
behavior.
@RyanGlScott
Copy link
Collaborator Author

I've started an attempt to split out bifunctors' classes into a separate bifunctor-classes-compat library. This almost works, save for one annoying complication. In bifunctors' Data.Bifunctor.TH.Internal module, we have code like the following:

-- By manually generating these names we avoid needing to use the
-- TemplateHaskell language extension when compiling the bifunctors library.
-- This allows the library to be used in stage1 cross-compilers.

bifunctorsPackageKey :: String
#ifdef CURRENT_PACKAGE_KEY
bifunctorsPackageKey = CURRENT_PACKAGE_KEY
#else
bifunctorsPackageKey = "bifunctors-" ++ showVersion version
#endif

mkBifunctorsName_tc :: String -> String -> Name
mkBifunctorsName_tc = mkNameG_tc bifunctorsPackageKey

mkBifunctorsName_v :: String -> String -> Name
mkBifunctorsName_v = mkNameG_v bifunctorsPackageKey

bimapConstValName :: Name
bimapConstValName = mkBifunctorsName_v "Data.Bifunctor.TH.Internal" "bimapConst"

bifoldrConstValName :: Name
bifoldrConstValName = mkBifunctorsName_v "Data.Bifunctor.TH.Internal" "bifoldrConst"

-- ...

On modern GHCs, none of this is necessary, as you can simply use the TemplateHaskellQuotes extension. On older GHCs without access to TemplateHaskellQuotes, however, we have to resort to a trick to be able to reference the appropriate Template Haskell Names for things without having to enable the TemplateHaskell extension (and thereby break cross-compilation).

There is a catch to this trick, however: it only works for things defined either in (1) the base library, or (2) the current library being built. After moving the classes to bifunctor-classes-compat, however, the classes are no longer defined in the same library as Data.Bifunctor.TH. As a result, we no longer have a way to gain access to the Names using this trick!

I'm a bit stumped at how best to handle this. Some options include:

  1. Move Data.Bifunctor.TH to bifunctor-classes-compat. This would put everything back into the same library and make the trick above possible once more. On the other hand, it would make bifunctor-classes-compat incur a th-abstraction dependency, which seems strange.
  2. Add a module to bifunctor-classes-compat that exports its version information (including the package hash) so that Data.Bifunctor.TH can make use of it. Again, this is a strange thing to export, but I don't see a better way to gain access to this information.

@phadej
Copy link
Contributor

phadej commented Jan 27, 2023

Sadly haskell/cabal#7027 haven't got implemented, now it would been handy

@phadej
Copy link
Contributor

phadej commented Jan 27, 2023

I don't think having Data.Bifunctor.TH in bifunctor-classes-compat is that bad. th-abstraction depends only on ghc boot packages, so it's not causing extra dependency problems.

Unfortunate, but could perfectly live with.

@phadej
Copy link
Contributor

phadej commented Jan 27, 2023

I was wondering. Is it actually true that template-haskell doesn't have a means to lookup a complete modulename (i.e. with unit-id as pkgname) using just a (short) pkgname (like used by PackageImports) and module name?

I wonder if i should open a GHC issue to resolve that eventually

@RyanGlScott
Copy link
Collaborator Author

I don't think having Data.Bifunctor.TH in bifunctor-classes-compat is that bad.

Sounds good to me. I'll go with that plan, then.

Is it actually true that template-haskell doesn't have a means to lookup a complete modulename (i.e. with unit-id as pkgname) using just a (short) pkgname (like used by PackageImports) and module name?

Not that I am aware of. The only ways I know to look this information up are:

  1. Pattern-matching on a Name produced with TemplateHaskellQuotes,
  2. Using the packageName function from GHC.Generics, or
  3. Using the CURRENT_PACKAGE_KEY trick (which only works for identifiers in the current package)

If I understand what you're asking, none of these would satisfy your criteria.

@phadej
Copy link
Contributor

phadej commented Jan 27, 2023

Yeah, it's not great.

Of course one could lookupName, but that requires the name to be in scope where the splice is run, though I don't think it will be impossible to require say Bifunctor be in scope then.

But OTOH threading the pkgname through all of the TH code is extra work...

RyanGlScott added a commit to ekmett/bifunctors that referenced this issue Jan 28, 2023
This moves the `Data.Bifunctor.TH` module, as well as all of the compatibility
modules in `bifunctors` (`Data.Bifunctor`, `Data.Bifoldable`, and
`Data.Bitraversable`) to a new `bifunctor-classes-compat` package. This new
package has fewer dependencies than `bifunctors` proper.  This is one step
towards being able to use `Bifunctor` in an upcoming `foldable1-classes-compat`
compatibility package. See ekmett/semigroupoids#130.

This is purely a refactoring, and there should be no change in user-visible
behavior.
RyanGlScott added a commit to ekmett/tagged that referenced this issue Feb 5, 2023
This is part of an effort to adapt to
[this Core Libraries Proposal](haskell/core-libraries-committee#9),
which adds `Foldable1` and `Bifoldable1` to `base`. This is a prerequisite for
re-exporting these classes from `semigroupoids`; see ekmett/semigroupoids#130.
RyanGlScott added a commit to ekmett/tagged that referenced this issue Feb 5, 2023
This is part of an effort to adapt to
[this Core Libraries Proposal](haskell/core-libraries-committee#9),
which adds `Foldable1` and `Bifoldable1` to `base`. This is a prerequisite for
re-exporting these classes from `semigroupoids`; see ekmett/semigroupoids#130.
RyanGlScott added a commit that referenced this issue Feb 5, 2023
This patch:

* Re-exports the `Foldable1` and `Bifoldable` classes from `base` or
  `foldable-classes-compat`, dependending on which version of `base` is being
  used.
* Migrates the `Foldable1` and `Bifoldable1` instances to their respective
  downstream packages. I have bumped the lower version bounds on `bifunctors`
  and `tagged` to ensure that they always provide these instances.
  (TODO RGS: Actually do this!)

Fixes #130.
@RyanGlScott
Copy link
Collaborator Author

I've made some more progress on this:

  • The foldable1-classes-compat library is now essentially finished, and we could release it to Hackage now if we wanted.
  • I have opened PRs to bifunctors and tagged (here and here, respectively) to migrate over the Foldable1/Bifoldable1 instances that were defined in semigroupoids.

While prototyping a patch for semigroupoids itself, I realized that we face a design choice that we will need to make a decision about. Currently, semigroupoids exports Foldable1 and Bifoldable1 from the Data.Semigroup.Foldable module, along with various utility functions:

module Data.Semigroup.Foldable
( Foldable1(..)
, intercalate1
, intercalateMap1
, traverse1_
, for1_
, sequenceA1_
, foldMapDefault1
, asum1
, foldrM1
, foldlM1
) where

The tricky part is that there are several differences between the API exported from Data.Semigroup.Foldable and the API that Data.Foldable1/Data.Bifoldable1 in base offer:

  • The largest difference is that the base versions of the type classes offer many more class methods (e.g., foldrMap1) than what the semigroupoids versions of the classes have.
  • On the flip side, semigroupoids also defines several functions that base does not offer (e.g., asum1).

Should we make an effort to make the semigroupoids API match that of base? Should we stick to semigroupoids' existing API? Somewhere in between?

@phadej
Copy link
Contributor

phadej commented Feb 5, 2023

We can think that Data.Foldable1 in base supersedes Data.Semigroup.Foldable.Class in semigroupoids. The Data.Semigroup.Foldable may have more methods.

E.g. asum1 is defined using Alt (which is not Alternative), a class defined in semigroupoids. foldMapDefault1 is just foldMap1 (as base doesn't need wrap the Monoid). for1_, traverse1_ are also defined using Apply, which is defined in semigroupoids.

I'd

  • Leave Data.Semigroup.Foldable.Class as is, exporting only methods which it defines
  • Deprecate Data.Semigroup.Foldable.Class
  • Data.Semigroup.Foldable could export all from Data.Foldable1, or just what it does now, or something in between (E.g. head, tai, i.e. clashing names may be left out)

@RyanGlScott
Copy link
Collaborator Author

Another thing I've realized is that if we want to depend on a sufficiently new version of bifunctors that provides Foldable1 instances, then we'll no longer be able to build semigroupoids with pre-8.0 versions of GHC. We might as well drop support for them before going through with the remaining changes.

RyanGlScott added a commit that referenced this issue Feb 5, 2023
This is a prerequisite for later changes planned in #130, where we will need to
bump the lower version bounds on `bifunctors` to bring in the changes from
ekmett/bifunctors#111.
RyanGlScott added a commit that referenced this issue Feb 5, 2023
This is a prerequisite for later changes planned in #130, where we will need to
bump the lower version bounds on `bifunctors` to bring in the changes from
ekmett/bifunctors#111.
@RyanGlScott
Copy link
Collaborator Author

#131 drops pre-8.0 GHC support.

RyanGlScott added a commit that referenced this issue Feb 6, 2023
This is a prerequisite for later changes planned in #130, where we will need to
bump the lower version bounds on `bifunctors` to bring in the changes from
ekmett/bifunctors#111.
RyanGlScott added a commit that referenced this issue Feb 7, 2023
This patch:

* Re-exports the `Foldable1` and `Bifoldable` classes from `base` or
  `foldable-classes-compat`, dependending on which version of `base` is being
  used.
* Migrates the `Foldable1` and `Bifoldable1` instances to their respective
  downstream packages. I have bumped the lower version bounds on `bifunctors`
  and `tagged` to ensure that they always provide these instances.
  (TODO RGS: Actually do this!)

Fixes #130.
@RyanGlScott
Copy link
Collaborator Author

#132 is a draft PR that migrates semigroupoids over to using Foldable1/Bifoldable1 from base. Feedback is very much appreciated!

RyanGlScott added a commit that referenced this issue Feb 7, 2023
This patch:

* Re-exports the `Foldable1` and `Bifoldable` classes from `base` or
  `foldable-classes-compat`, depending on which version of `base` is being
  used.
* Migrates the `Foldable1` and `Bifoldable1` instances to their respective
  downstream packages. I have bumped the lower version bounds on `bifunctors`
  and `tagged` to ensure that they always provide these instances.
  (TODO RGS: Actually do this!)

Fixes #130.
RyanGlScott added a commit to ekmett/bifunctors that referenced this issue Feb 10, 2023
This is part of an effort to adapt to
[this Core Libraries Proposal](haskell/core-libraries-committee#9),
which adds `Foldable1` and `Bifoldable1`. This is a prerequisite for
re-exporting these classes from `semigroupoids`; see ekmett/semigroupoids#130.
RyanGlScott added a commit to ekmett/tagged that referenced this issue Feb 18, 2023
This is part of an effort to adapt to
[this Core Libraries Proposal](haskell/core-libraries-committee#9),
which adds `Foldable1` and `Bifoldable1` to `base`. This is a prerequisite for
re-exporting these classes from `semigroupoids`; see ekmett/semigroupoids#130.
@RyanGlScott
Copy link
Collaborator Author

GHC 9.6.1-alpha3 is now out, and I believe I've put foldable1-classes-compat into a state where it is ready for a Hackage release. I'll do so within the coming days, unless there's something I've overlooked. (If I have, please speak up!)

RyanGlScott added a commit to ekmett/bifunctors that referenced this issue Feb 25, 2023
This is part of an effort to adapt to
[this Core Libraries Proposal](haskell/core-libraries-committee#9),
which adds `Foldable1` and `Bifoldable1`. This is a prerequisite for
re-exporting these classes from `semigroupoids`; see ekmett/semigroupoids#130.
RyanGlScott added a commit to ekmett/bifunctors that referenced this issue Feb 25, 2023
This is part of an effort to adapt to
[this Core Libraries Proposal](haskell/core-libraries-committee#9),
which adds `Foldable1` and `Bifoldable1`. This is a prerequisite for
re-exporting these classes from `semigroupoids`; see ekmett/semigroupoids#130.
RyanGlScott added a commit to ekmett/bifunctors that referenced this issue Feb 25, 2023
(This cherry-picks #115 to the `main` branch.)

This is part of an effort to adapt to
[this Core Libraries Proposal](haskell/core-libraries-committee#9),
which adds `Foldable1` and `Bifoldable1`. This is a prerequisite for
re-exporting these classes from `semigroupoids`; see ekmett/semigroupoids#130.
RyanGlScott added a commit that referenced this issue Feb 25, 2023
This patch:

* Re-exports the `Foldable1` and `Bifoldable` classes from `base` or
  `foldable-classes-compat`, depending on which version of `base` is being
  used.
* Migrates the `Foldable1` and `Bifoldable1` instances to their respective
  downstream packages. I have bumped the lower version bounds on `bifunctors`
  and `tagged` to ensure that they always provide these instances.
  (TODO RGS: Actually do this!)

Fixes #130.
RyanGlScott added a commit to ekmett/bifunctors that referenced this issue Feb 25, 2023
(This cherry-picks #115 to the `main` branch.)

This is part of an effort to adapt to
[this Core Libraries Proposal](haskell/core-libraries-committee#9),
which adds `Foldable1` and `Bifoldable1`. This is a prerequisite for
re-exporting these classes from `semigroupoids`; see ekmett/semigroupoids#130.
RyanGlScott added a commit that referenced this issue Mar 5, 2023
This patch:

* Re-exports the `Foldable1` and `Bifoldable` classes from `base` or
  `foldable-classes-compat`, depending on which version of `base` is being
  used.
* Migrates the `Foldable1` and `Bifoldable1` instances to their respective
  downstream packages. I have bumped the lower version bounds on `bifunctors`
  and `tagged` to ensure that they always provide these instances.

Fixes #130.
RyanGlScott added a commit that referenced this issue Mar 12, 2023
This patch:

* Re-exports the `Foldable1` and `Bifoldable` classes from `base` or
  `foldable-classes-compat`, depending on which version of `base` is being
  used.
* Migrates the `Foldable1` and `Bifoldable1` instances to their respective
  downstream packages. I have bumped the lower version bounds on `bifunctors`
  and `tagged` to ensure that they always provide these instances.
* Bump primary version number to 6. This is done out of an abundance of caution
  to warn users that they may need to migrate existing code that defines
  `Foldable1` instances without implementations of `foldMap1`. See the
  `CHANGELOG` entry for the full details.

Fixes #130.
RyanGlScott added a commit that referenced this issue Mar 12, 2023
This patch:

* Re-exports the `Foldable1` and `Bifoldable` classes from `base` or
  `foldable-classes-compat`, depending on which version of `base` is being
  used.
* Migrates the `Foldable1` and `Bifoldable1` instances to their respective
  downstream packages. I have bumped the lower version bounds on `bifunctors`
  and `tagged` to ensure that they always provide these instances.
* Bump primary version number to 6. This is done out of an abundance of caution
  to warn users that they may need to migrate existing code that defines
  `Foldable1` instances without implementations of `foldMap1`. See the
  `CHANGELOG` entry for the full details.

Fixes #130.
@RyanGlScott
Copy link
Collaborator Author

I've uploaded semigroupoids-6 to Hackage with these changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants