44{-# LANGUAGE MultiParamTypeClasses #-}
55{-# LANGUAGE PolyKinds #-}
66{-# LANGUAGE RankNTypes #-}
7+ {-# LANGUAGE ScopedTypeVariables #-}
78{-# LANGUAGE StandaloneDeriving #-}
9+ {-# LANGUAGE TypeApplications #-}
810{-# LANGUAGE UndecidableInstances #-}
9- {-# LANGUAGE QuantifiedConstraints #-}
1011
1112module Nix.Utils.Fix1 where
1213
@@ -22,6 +23,9 @@ import Control.Monad.Catch ( MonadCatch
2223 , MonadThrow )
2324import Control.Monad.Reader ( MonadReader )
2425import Control.Monad.State ( MonadState )
26+ import Data.Constraint ( (\\) )
27+ import Data.Constraint.Forall ( Forall , inst )
28+
2529
2630import Nix.Thunk -- TODO: Move MonadTransWrap somewhere better, or find something that already exists
2731
@@ -60,8 +64,12 @@ deriving instance MonadMask (t (Fix1T t m) m) => MonadMask (Fix1T t m)
6064deriving instance MonadReader e (t (Fix1T t m ) m ) => MonadReader e (Fix1T t m )
6165deriving instance MonadState s (t (Fix1T t m ) m ) => MonadState s (Fix1T t m )
6266
63- instance (forall m . MonadTransWrap (t (Fix1T t m ))) => MonadTransWrap (Fix1T t ) where
64- liftWrap f (Fix1T a) = Fix1T $ liftWrap f a
67+ class MonadTransWrap (t (Fix1T t m )) => TransWrapAtFix1T t m
68+
69+ instance MonadTransWrap (t (Fix1T t m )) => TransWrapAtFix1T t m
70+
71+ instance Forall (TransWrapAtFix1T t ) => MonadTransWrap (Fix1T t ) where
72+ liftWrap (f :: forall x . m x -> m x ) (Fix1T (a :: (t (Fix1T t m ) m a ))) = Fix1T $ liftWrap f a \\ inst @ (TransWrapAtFix1T t ) @ m
6573
6674{-
6775
0 commit comments