mirror of
https://github.com/barrucadu/dejafu.git
synced 2024-09-11 06:25:45 +03:00
Rewrite concurrency changelog
This commit is contained in:
parent
e863481076
commit
25ba98509f
@ -1,289 +0,0 @@
|
||||
Release Notes
|
||||
=============
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
This project is versioned according to the [Package Versioning Policy](https://pvp.haskell.org), the
|
||||
*de facto* standard Haskell versioning scheme.
|
||||
|
||||
|
||||
1.4.0.0
|
||||
-------
|
||||
|
||||
- **Date** 2017-01-19
|
||||
- **Git tag** [concurrency-1.4.0.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.4.0.0
|
||||
|
||||
### Control.Monad.Conc.Class
|
||||
|
||||
- The `peekTicket'` now has a more concrete type, to make deriving newtype instances of `MonadConc`
|
||||
possible.
|
||||
|
||||
- Old: `MonadConc m => proxy m -> Ticket m a -> a`
|
||||
- New: `MonadConc m => Proxy m -> Ticket m a -> a`
|
||||
|
||||
[concurrency-1.4.0.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.4.0.0
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.3.0.0
|
||||
-------
|
||||
|
||||
- **Date** 2017-12-23
|
||||
- **Git tag** [concurrency-1.3.0.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.3.0.0
|
||||
|
||||
### Control.Concurrent.Classy.Async
|
||||
|
||||
- New `asyncBound`, `asyncBoundN`, `withAsyncBound`, and `withAsyncBoundN` functions for doing
|
||||
asynchronous actions on bound threads. (#126)
|
||||
|
||||
### Control.Monad.Conc.Class
|
||||
|
||||
- `MonadConc` now supports bound threads with new `forkOS`, `forkOSN`, and `isCurrentThreadBound`
|
||||
functions. (#126)
|
||||
|
||||
- New `runInBoundThread` and `runInUnboundThread` functions. (#126)
|
||||
|
||||
- The `rtsSupportsBoundThreads` definition is now the definition from Control.Concurrent
|
||||
re-exported, not just `False`. (#126)
|
||||
|
||||
Note that bound threads are only supported if you compile with GHC and link with -threaded.
|
||||
|
||||
[concurrency-1.3.0.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.3.0.0
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.2.3.0
|
||||
-------
|
||||
|
||||
- **Date** 2017-11-30
|
||||
- **Git tag** [concurrency-1.2.3.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.2.3.0
|
||||
|
||||
### Control.Concurrent.Classy.Async
|
||||
|
||||
- New named-thread variants of the `withAsync*` functions: `withAsyncN`, `withAsyncOnN`,
|
||||
`withAsyncWithUnmaskN`, and `withAsyncOnWithUnmaskN` (#148).
|
||||
|
||||
[concurrency-1.2.3.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.2.3.0
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.2.2.0
|
||||
-------
|
||||
|
||||
- **Date** 2017-11-05
|
||||
- **Git tag** [concurrency-1.2.2.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.2.2.0
|
||||
|
||||
### Control.Monad.Conc.Class
|
||||
|
||||
- A new `IsConc` type (and `toIsConc`, `fromIsConc` functions), where a value of type `IsConc m a`
|
||||
can only be constructed if `m` has a `MonadConc` instance. Its `STM` type is `IsSTM (STM m)`.
|
||||
(#144)
|
||||
|
||||
- The provided transformer instances now use the `modifyCRefCAS_` of the underlying monad, rather
|
||||
than the default definition in terms of `modifyCRefCAS`.
|
||||
|
||||
### Control.Monad.STM.Class
|
||||
|
||||
- A new `IsSTM` type (and `toIsSTM`, `fromIsSTM` functions), where a value of type `IsSTM m a` can
|
||||
only be constructed if `m` has a `MonadSTM` instance. (#144)
|
||||
|
||||
[concurrency-1.2.2.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.2.2.0
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.2.1.2
|
||||
-------
|
||||
|
||||
- **Date** 2017-10-14
|
||||
- **Git tag** [concurrency-1.2.1.2][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.2.1.2
|
||||
|
||||
### Control.Monad.Conc.Class
|
||||
|
||||
- Fixes an infinite loop introduced for the `IO` instance of `MonadConc` in `forkWithUnmask` and
|
||||
`forkOnWithUnmask` in 1.2.1.1 (#134).
|
||||
|
||||
[concurrency-1.2.1.2]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.2.1.2
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.2.1.1
|
||||
-------
|
||||
|
||||
- **Date** 2017-10-11
|
||||
- **Git tag** [concurrency-1.2.1.1][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.2.1.1
|
||||
|
||||
### Control.Monad.Conc.Class
|
||||
|
||||
- The `IO` instance of `MonadConc` now names threads with `GHC.Conc.labelThread`, so thread names
|
||||
now appear in debugging traces of normal execution.
|
||||
|
||||
[concurrency-1.2.1.1]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.2.1.1
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.2.1.0
|
||||
-------
|
||||
|
||||
- **Date** 2017-10-02
|
||||
- **Git tag** [concurrency-1.2.1.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.2.1.0
|
||||
|
||||
### Control.Concurrent.Classy.Async
|
||||
|
||||
- New named-thread variants of the `async*` functions: `asyncN`, `asyncOnN`, `asyncWithUnmaskN`, and
|
||||
`asyncOnWithUnmaskN` (#125).
|
||||
|
||||
[concurrency-1.2.1.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.2.1.0
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.2.0.0
|
||||
-------
|
||||
|
||||
- **Date** 2017-09-16
|
||||
- **Git tag** [concurrency-1.2.0.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.2.0.0
|
||||
|
||||
### Control.Monad.STM.Class
|
||||
|
||||
- `MonadSTM` now has a `MonadPlus` constraint.
|
||||
- The `orElse` and `retry` functions have been promoted to top-level definitions, and are aliases
|
||||
for `mplus` and `mzero`.
|
||||
|
||||
[concurrency-1.2.0.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.2.0.0
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.1.2.1
|
||||
-------
|
||||
|
||||
- **Date** 2017-06-07
|
||||
- **Git tag** [concurrency-1.1.2.1][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.1.2.1
|
||||
|
||||
### Changed
|
||||
|
||||
- The `isEmptyMVar` function is now implemented using `tryReadMVar` instead of a combination of
|
||||
`tryTakeMVar` and `putMVar`. It no longer modifies the contents of the `MVar` and can no longer
|
||||
block.
|
||||
|
||||
### Miscellaneous
|
||||
|
||||
- There is now a changelog.
|
||||
|
||||
[concurrency-1.1.2.1]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.1.2.1
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.1.2.0
|
||||
-------
|
||||
|
||||
- **Date** 2017-04-05
|
||||
- **Git tag** [concurrency-1.1.2.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.1.2.0
|
||||
|
||||
### Control.Concurrent.Classy.Async
|
||||
|
||||
- New functions:
|
||||
- `uninterruptibleCancel` function, which is `cancel` inside an
|
||||
uninterruptible mask.
|
||||
- `replicateConcurrently` function, which performs an action many
|
||||
times in separate threads.
|
||||
- `concurrently_`, `mapConcurrently_`, `forConcurrently_`, and
|
||||
`replicateConcurrently_` functions, which discard the result of
|
||||
the non-_ version.
|
||||
- New instances:
|
||||
- `Semigroup` instance for `Concurrently` when built with base 4.9.
|
||||
- `Monoid` instance for `Concurrently`.
|
||||
|
||||
### Control.Monad.Conc.Class
|
||||
|
||||
- The `mask_` and `uninterruptibleMask_` functions from Control.Monad.Catch are now re-exported.
|
||||
|
||||
### Changed
|
||||
|
||||
- The `cancel` and the `withAsync` functions now block until the `Async` action terminates, to match
|
||||
changes in the main async package.
|
||||
|
||||
### Miscellaneous
|
||||
|
||||
- Every definition, class, and instance now has a Haddock "@since" annotation.
|
||||
|
||||
[concurrency-1.1.2.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.1.2.0
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.1.1.0
|
||||
-------
|
||||
|
||||
- **Date** 2017-03-04
|
||||
- **Git tag** [concurrency-1.1.1.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.1.1.0
|
||||
|
||||
### Miscellaneous
|
||||
|
||||
- The async-dejafu package has been pulled into this package as the Control.Concurrent.Classy.Async
|
||||
module. async-dejafu is now __deprecated__.
|
||||
|
||||
[concurrency-1.1.1.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.1.1.0
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.1.0.0
|
||||
-------
|
||||
|
||||
- **Date** 2017-02-21
|
||||
- **Git tag** [concurrency-1.1.0.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.1.0.0
|
||||
|
||||
### Control.Monad.Conc.Class
|
||||
|
||||
- The `MonadConc` class now defines `tryReadMVar`, a non-blocking version of `readMVar` akin to
|
||||
`tryTakeMVar`.
|
||||
- The `MonadConc` class no longer defines `_concMessage`, there is no alternative provided, it is
|
||||
just gone.
|
||||
|
||||
[concurrency-1.1.0.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.1.0.0
|
||||
|
||||
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
1.0.0.0
|
||||
-------
|
||||
|
||||
- **Date** 2016-09-10
|
||||
- **Git tag** [concurrency-1.0.0.0][]
|
||||
- **Hackage** https://hackage.haskell.org/package/concurrency-1.0.0.0
|
||||
|
||||
Initial release. Go read the API docs.
|
||||
|
||||
[concurrency-1.0.0.0]: https://github.com/barrucadu/dejafu/releases/tag/concurrency-1.0.0.0
|
260
concurrency/CHANGELOG.rst
Normal file
260
concurrency/CHANGELOG.rst
Normal file
@ -0,0 +1,260 @@
|
||||
Release Notes
|
||||
=============
|
||||
|
||||
This project is versioned according to the PVP_, the *de facto*
|
||||
standard Haskell versioning scheme.
|
||||
|
||||
.. _PVP: https://pvp.haskell.org/
|
||||
|
||||
|
||||
1.4.0.0 (2017-01-19)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.4.0.0`
|
||||
* Hackage: :hackage:`concurrency-1.4.0.0`
|
||||
|
||||
Changed
|
||||
~~~~~~~
|
||||
|
||||
* ``Control.Monad.Conc.Class.peekTicket'`` has a more concrete type,
|
||||
to make deriving newtype instances of ``MonadConc`` possible:
|
||||
|
||||
* Old: ``MonadConc m => proxy m -> Ticket m a -> a``
|
||||
* New: ``MonadConc m => Proxy m -> Ticket m a -> a``
|
||||
|
||||
|
||||
1.3.0.0 - The Bound Thread Release (2017-12-23)
|
||||
-----------------------------------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.3.0.0`
|
||||
* Hackage: :hackage:`concurrency-1.3.0.0`
|
||||
|
||||
**Note:** bound threads are only supported if you compile with GHC and
|
||||
link with -threaded.
|
||||
|
||||
Added
|
||||
~~~~~
|
||||
|
||||
* (:pull:`145`) Bound thread variants of the ``withAsync`` functions:
|
||||
|
||||
* ``Control.Concurrent.Classy.Async.asyncBound``
|
||||
* ``Control.Concurrent.Classy.Async.asyncBoundN``
|
||||
* ``Control.Concurrent.Classy.Async.withAsyncBound``
|
||||
* ``Control.Concurrent.Classy.Async.withAsyncBoundN``
|
||||
|
||||
* (:pull:`145`) Bound thread functions in ``MonadConc``:
|
||||
|
||||
* ``Control.Monad.Conc.Class.forkOS``
|
||||
* ``Control.Monad.Conc.Class.forkOSN``
|
||||
* ``Control.Monad.Conc.Class.isCurrentThreadBound``
|
||||
|
||||
* (:pull:`145`) Helper functions for bound threads:
|
||||
|
||||
* ``Control.Monad.Conc.Class.runInBoundThread``
|
||||
* ``Control.Monad.Conc.Class.runInUnboundThread``
|
||||
|
||||
Changed
|
||||
~~~~~~~
|
||||
|
||||
* (:pull:`145`) ``Control.Monad.Conc.Class.rtsSupportsBoundThreads``
|
||||
is a re-export from ``Control.Concurrent``.
|
||||
|
||||
|
||||
1.2.3.0 (2017-11-30)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.2.3.0`
|
||||
* Hackage: :hackage:`concurrency-1.2.3.0`
|
||||
|
||||
Added
|
||||
~~~~~
|
||||
|
||||
* (:issue:`148`) Named thread variants of the ``withAsync`` functions:
|
||||
|
||||
* ``Control.Concurrent.Classy.Async.withAsyncN``
|
||||
* ``Control.Concurrent.Classy.Async.withAsyncOnN``
|
||||
* ``Control.Concurrent.Classy.Async.withAsyncWithUnmaskN``
|
||||
* ``Control.Concurrent.Classy.Async.withAsyncOnWithUnmaskN``
|
||||
|
||||
|
||||
1.2.2.0 (2017-11-05)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.2.2.0`
|
||||
* Hackage: :hackage:`concurrency-1.2.2.0`
|
||||
|
||||
Added
|
||||
~~~~~
|
||||
|
||||
* (:issue:`144`) ``IsConc`` and ``IsSTM`` wrapper types:
|
||||
|
||||
* ``Control.Monad.Conc.Class.IsConc`` (constructor unexported)
|
||||
* ``Control.Monad.Conc.Class.toIsConc``
|
||||
* ``Control.Monad.Conc.Class.fromIsConc``
|
||||
* ``Control.Monad.STM.Class.IsSTM`` (constructor unexported)
|
||||
* ``Control.Monad.STM.Class.toIsSTM``
|
||||
* ``Control.Monad.STM.Class.fromIsSTM``
|
||||
|
||||
Changed
|
||||
~~~~~~~
|
||||
|
||||
* ``Control.Monad.Conc.Class.modifyCRefCAS_`` for transformer
|
||||
instances delegates to the underlying monad, rather than using the
|
||||
default definition in terms of ``modifyCRefCAS``.
|
||||
|
||||
|
||||
1.2.1.2 (2017-10-14)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.2.1.2`
|
||||
* Hackage: :hackage:`concurrency-1.2.1.2`
|
||||
|
||||
Fixed
|
||||
~~~~~
|
||||
|
||||
* (:issue:`134`) ``Control.Monad.Conc.Class.forkWithUnmask`` and
|
||||
``forkOnWithUnmask`` for the ``IO`` instance does not infinitely
|
||||
loop (bug introduced in :tag:`concurrency-1.2.1.1`).
|
||||
|
||||
|
||||
1.2.1.1 (2017-10-11)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.2.1.1`
|
||||
* Hackage: :hackage:`concurrency-1.2.1.1`
|
||||
|
||||
Changed
|
||||
~~~~~~~
|
||||
|
||||
* Named threads for ``IO`` are implemented with
|
||||
``GHC.Conc.labelThread``.
|
||||
|
||||
|
||||
1.2.1.0 (2017-10-02)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.2.1.0`
|
||||
* Hackage: :hackage:`concurrency-1.2.1.0`
|
||||
|
||||
Added
|
||||
~~~~~
|
||||
|
||||
* (:pull:`125`) Named thread variants of the ``async`` functions:
|
||||
|
||||
* ``Control.Concurrent.Classy.Async.asyncN``
|
||||
* ``Control.Concurrent.Classy.Async.asyncOnN``
|
||||
* ``Control.Concurrent.Classy.Async.asyncWithUnmaskN``
|
||||
* ``Control.Concurrent.Classy.Async.asyncOnWithUnmaskN``
|
||||
|
||||
|
||||
1.2.0.0 (2017-09-16)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.2.0.0`
|
||||
* Hackage: :hackage:`concurrency-1.2.0.0`
|
||||
|
||||
Changed
|
||||
~~~~~~~
|
||||
|
||||
* ``MonadPlus`` is a superclass of ``MonadSTM``.
|
||||
|
||||
* ``Control.Monad.STM.Class.orElse`` is a top-level alias for
|
||||
``mplus``.
|
||||
|
||||
* ``Control.Monad.STM.Class.retry`` is a top-level alias for
|
||||
``mzero``.
|
||||
|
||||
|
||||
1.1.2.1 (2017-06-07)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.1.2.1`
|
||||
* Hackage: :hackage:`concurrency-1.1.2.1`
|
||||
|
||||
Changed
|
||||
~~~~~~~
|
||||
|
||||
* ``Control.Concurrent.Classy.MVar.isEmptyMVar`` does not briefly
|
||||
empties the ``MVar``, and does not block.
|
||||
|
||||
|
||||
1.1.2.0 (2017-04-05)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.1.2.0`
|
||||
* Hackage: :hackage:`concurrency-1.1.2.0`
|
||||
|
||||
Added
|
||||
~~~~~
|
||||
|
||||
* Missing functions copied from :hackage:`async`:
|
||||
|
||||
* ``Control.Concurrent.Classy.Async.uninterruptibleCancel``
|
||||
* ``Control.Concurrent.Classy.Async.replicateConcurrently``
|
||||
* ``Control.Concurrent.Classy.Async.concurrently_``
|
||||
* ``Control.Concurrent.Classy.Async.mapConcurrently_``
|
||||
* ``Control.Concurrent.Classy.Async.forConcurrently_``
|
||||
* ``Control.Concurrent.Classy.Async.replicateConcurrently_``
|
||||
|
||||
* ``Control.Concurrent.Classy.Async.Concurrently`` has a ``Semigroup``
|
||||
instance when built with :hackage:`base` >= 4.9.
|
||||
|
||||
* ``Control.Concurrent.Classy.Async.Concurrently`` has a ``Monoid``
|
||||
instance.
|
||||
|
||||
* ``Control.Monad.Conc.Class`` re-exports
|
||||
``Control.Monad.Catch.mask_`` and ``uninterruptibleMask_``.
|
||||
|
||||
Changed
|
||||
~~~~~~~
|
||||
|
||||
* (:pull:`77`) To match changes in :hackage:`async`,
|
||||
``Control.Concurrent.Classy.Async.cancel`` and ``withAsync`` block
|
||||
until the ``Async`` is killed.
|
||||
|
||||
Miscellaneous
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
* Every definition, class, and instance now has a Haddock ``@since``
|
||||
annotation.
|
||||
|
||||
|
||||
1.1.1.0 - The Async Release (2017-03-04)
|
||||
----------------------------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.1.1.0`
|
||||
* Hackage: :hackage:`concurrency-1.1.1.0`
|
||||
|
||||
Added
|
||||
~~~~~
|
||||
|
||||
* The ``Control.Concurrent.Classy.Async`` module.
|
||||
|
||||
|
||||
1.1.0.0 (2017-02-21)
|
||||
--------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.1.0.0`
|
||||
* Hackage: :hackage:`concurrency-1.1.0.0`
|
||||
|
||||
Added
|
||||
~~~~~
|
||||
|
||||
* ``Control.Monad.Conc.Class.tryReadMVar``
|
||||
|
||||
Removed
|
||||
~~~~~~~
|
||||
|
||||
* ``Control.Monad.Conc.Class._concMessage``
|
||||
|
||||
|
||||
1.0.0.0 - The Initial Release (2016-09-10)
|
||||
------------------------------------------
|
||||
|
||||
* Git: :tag:`concurrency-1.0.0.0`
|
||||
* Hackage: :hackage:`concurrency-1.0.0.0`
|
||||
|
||||
Added
|
||||
~~~~~
|
||||
|
||||
* Everything.
|
@ -22,7 +22,7 @@ maintainer: mike@barrucadu.co.uk
|
||||
copyright: (c) 2016--2017 Michael Walker
|
||||
category: Concurrency
|
||||
build-type: Simple
|
||||
extra-source-files: README.markdown CHANGELOG.markdown
|
||||
extra-source-files: README.markdown CHANGELOG.rst
|
||||
cabal-version: >=1.10
|
||||
|
||||
source-repository head
|
||||
|
@ -1 +0,0 @@
|
||||
../concurrency/CHANGELOG.markdown
|
1
doc/changelog_concurrency.rst
Symbolic link
1
doc/changelog_concurrency.rst
Symbolic link
@ -0,0 +1 @@
|
||||
../concurrency/CHANGELOG.rst
|
@ -58,6 +58,7 @@ _repo = 'https://github.com/barrucadu/dejafu/'
|
||||
extlinks = {
|
||||
'commit': (_repo + 'commit/%s', 'commit '),
|
||||
'issue': (_repo + 'issues/%s', 'issue #'),
|
||||
'pull': (_repo + 'pull/%s', 'pull request #'),
|
||||
'tag': (_repo + 'releases/tag/%s', 'tag '),
|
||||
'github': (_repo + '%s', ''),
|
||||
'hackage': ('https://hackage.haskell.org/package/%s', ''),
|
||||
|
Loading…
Reference in New Issue
Block a user