Skip to content

Commit e87218c

Browse files
committed
fixup! fixup! io-classes: Add MonadUnique to support Data.Unique
1 parent 568698a commit e87218c

File tree

2 files changed

+40
-41
lines changed

2 files changed

+40
-41
lines changed
Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,40 @@
11
{-# OPTIONS_GHC -Wno-orphans #-}
2-
{-# LANGUAGE TypeFamilies, DerivingVia, UndecidableInstances #-}
2+
{-# LANGUAGE TypeFamilies #-}
33

44
module Control.Monad.Class.MonadUnique.Trans () where
55

6-
import Data.Kind (Type)
7-
86
import Control.Monad.Cont (ContT)
97
import Control.Monad.Except (ExceptT)
108
import Control.Monad.RWS.Lazy qualified as Lazy
119
import Control.Monad.RWS.Strict qualified as Strict
1210
import Control.Monad.State.Lazy qualified as Lazy
1311
import Control.Monad.State.Strict qualified as Strict
14-
import Control.Monad.Trans (MonadTrans(..))
1512
import Control.Monad.Writer.Lazy qualified as Lazy
1613
import Control.Monad.Writer.Strict qualified as Strict
1714

1815
import Control.Monad.Class.MonadUnique
1916

2017

21-
type Trans
22-
:: ((Type -> Type) -> (Type -> Type))
23-
-> (Type -> Type) -> (Type -> Type)
24-
newtype Trans t m a = Trans (t m a)
25-
deriving (Functor, Applicative, Monad, MonadTrans)
26-
27-
instance (MonadTrans t, MonadUnique m) => MonadUnique (Trans t m) where
28-
type Unique (Trans t m) = Unique m
29-
newUnique = lift newUnique
30-
hashUnique = hashUnique @m
31-
32-
33-
deriving via Trans (ContT r) m
34-
instance MonadUnique m => MonadUnique (ContT r m)
35-
36-
deriving via Trans (ExceptT e) m
37-
instance MonadUnique m => MonadUnique (ExceptT e m)
18+
instance MonadUnique m => MonadUnique (ContT r m) where
19+
type Unique (ContT r m) = UniqueFor (ContT r) m
3820

39-
deriving via Trans (Lazy.RWST r w s) m
40-
instance (MonadUnique m, Monoid w) => MonadUnique (Lazy.RWST r w s m)
21+
instance MonadUnique m => MonadUnique (ExceptT e m) where
22+
type Unique (ExceptT e m) = UniqueFor (ExceptT e) m
4123

42-
deriving via Trans (Strict.RWST r w s) m
43-
instance (MonadUnique m, Monoid w) => MonadUnique (Strict.RWST r w s m)
24+
instance (MonadUnique m, Monoid w) => MonadUnique (Lazy.RWST r w s m) where
25+
type Unique (Lazy.RWST r w s m) = UniqueFor (Lazy.RWST r w s) m
4426

45-
deriving via Trans (Lazy.StateT s) m
46-
instance MonadUnique m => MonadUnique (Lazy.StateT s m)
27+
instance (MonadUnique m, Monoid w) => MonadUnique (Strict.RWST r w s m) where
28+
type Unique (Strict.RWST r w s m) = UniqueFor (Strict.RWST r w s) m
4729

48-
deriving via Trans (Strict.StateT s) m
49-
instance MonadUnique m => MonadUnique (Strict.StateT s m)
30+
instance MonadUnique m => MonadUnique (Lazy.StateT s m) where
31+
type Unique (Lazy.StateT s m) = UniqueFor (Lazy.StateT s) m
5032

51-
deriving via Trans (Lazy.WriterT w) m
52-
instance (MonadUnique m, Monoid w) => MonadUnique (Lazy.WriterT w m)
33+
instance MonadUnique m => MonadUnique (Strict.StateT s m) where
34+
type Unique (Strict.StateT s m) = UniqueFor (Strict.StateT s) m
5335

54-
deriving via Trans (Strict.WriterT w) m
55-
instance (MonadUnique m, Monoid w) => MonadUnique (Strict.WriterT w m)
36+
instance (MonadUnique m, Monoid w) => MonadUnique (Lazy.WriterT w m) where
37+
type Unique (Lazy.WriterT w m) = UniqueFor (Lazy.WriterT w) m
5638

39+
instance (MonadUnique m, Monoid w) => MonadUnique (Strict.WriterT w m) where
40+
type Unique (Strict.WriterT w m) = UniqueFor (Strict.WriterT w) m
Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,48 @@
1-
{-# LANGUAGE TypeFamilies, AllowAmbiguousTypes #-}
1+
{-# LANGUAGE DefaultSignatures #-}
2+
{-# LANGUAGE TypeFamilyDependencies #-}
23

34
-- | A generalisation of the
45
-- <https://hackage.haskell.org/package/base/docs/Data-Unique.html Data.Unique>
56
-- API to both 'IO' and <https://hackage.haskell.org/package/io-sim IOSim>.
67
--
78
module Control.Monad.Class.MonadUnique (
8-
MonadUnique(..)
9+
MonadUnique (..),
10+
UniqueFor (..),
911
) where
1012

1113
-- base
1214
import Data.Kind (Type)
1315
import Data.Unique qualified as IO
1416

1517
-- transformers
16-
import Control.Monad.Reader (ReaderT(..), lift)
18+
import Control.Monad.Reader (MonadTrans(..), ReaderT(..), lift)
1719

1820

1921
class (Monad m, Eq (Unique m), Ord (Unique m)) => MonadUnique m where
20-
type Unique m :: Type
22+
type Unique m = (unique :: Type) | unique -> m
2123
newUnique :: m (Unique m)
2224
hashUnique :: Unique m -> Int
2325

26+
default
27+
newUnique
28+
:: (m ~ t n, Unique m ~ UniqueFor t n, MonadTrans t, MonadUnique n)
29+
=> m (Unique m)
30+
default
31+
hashUnique
32+
:: (m ~ t n, Unique m ~ UniqueFor t n, MonadUnique n)
33+
=> Unique m -> Int
34+
newUnique = lift (MkUniqueFor <$> newUnique)
35+
hashUnique = hashUnique . unMkUniqueFor
36+
2437
instance MonadUnique IO where
2538
type Unique IO = IO.Unique
2639
newUnique = IO.newUnique
2740
hashUnique = IO.hashUnique
2841

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
3342

43+
newtype UniqueFor t m = MkUniqueFor{ unMkUniqueFor :: Unique m }
44+
deriving instance MonadUnique m => Eq (UniqueFor r m)
45+
deriving instance MonadUnique m => Ord (UniqueFor r m)
46+
47+
instance MonadUnique m => MonadUnique (ReaderT r m) where
48+
type Unique (ReaderT r m) = UniqueFor (ReaderT r) m

0 commit comments

Comments
 (0)