Skip to content

Commit 3905bde

Browse files
committed
io-classes: Add MonadUnique to support Data.Unique
1 parent 4f5a4cd commit 3905bde

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

io-classes/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Revsion history of io-classes
22

3+
### next release
4+
5+
* Added module `Control.Monad.Class.MonadUnique` generalising `Data.Unique`.
6+
37
### 1.8.0.1
48

59
* Added support for `ghc-9.2`.

io-classes/io-classes.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ library
8787
Control.Monad.Class.MonadTime
8888
Control.Monad.Class.MonadTimer
8989
Control.Monad.Class.MonadTest
90+
Control.Monad.Class.MonadUnique
9091
default-language: GHC2021
9192
default-extensions: LambdaCase
9293
build-depends: base >=4.16 && <4.22,
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{-# LANGUAGE TypeFamilies, AllowAmbiguousTypes #-}
2+
3+
-- | A generalisation of the
4+
-- <https://hackage.haskell.org/package/base/docs/Data-Unique.html Data.Unique>
5+
-- API to both 'IO' and <https://hackage.haskell.org/package/io-sim IOSim>.
6+
--
7+
module Control.Monad.Class.MonadUnique (
8+
MonadUnique(..)
9+
) where
10+
11+
-- base
12+
import Data.Kind (Type)
13+
import Data.Unique qualified as IO
14+
15+
-- transformers
16+
import Control.Monad.Reader (ReaderT(..), lift)
17+
18+
19+
class (Monad m, Eq (Unique m), Ord (Unique m)) => MonadUnique m where
20+
type Unique m :: Type
21+
newUnique :: m (Unique m)
22+
hashUnique :: Unique m -> Int
23+
24+
instance MonadUnique IO where
25+
type Unique IO = IO.Unique
26+
newUnique = IO.newUnique
27+
hashUnique = IO.hashUnique
28+
29+
instance MonadUnique m => MonadUnique (ReaderT r m) where
30+
type Unique (ReaderT r m) = Unique m
31+
newUnique = lift newUnique
32+
hashUnique = hashUnique @m
33+

0 commit comments

Comments
 (0)