From dcf722d0515e7aa3c21ef8caaa6b493b0364a50d Mon Sep 17 00:00:00 2001 From: Anton-Latukha Date: Tue, 9 Feb 2021 04:00:31 +0200 Subject: [PATCH] Eliminate use of QuantifiedConstraints to support GHC < 8.6 --- hnix.cabal | 1 + src/Nix/Scope/Basic.hs | 1 + src/Nix/Standard.hs | 11 ++++++++--- src/Nix/Thunk.hs | 15 +++++++++++++-- src/Nix/Utils/Fix1.hs | 7 +++++-- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/hnix.cabal b/hnix.cabal index 873e6c396..66a2c50ba 100644 --- a/hnix.cabal +++ b/hnix.cabal @@ -404,6 +404,7 @@ library , binary >= 0.8.5 && < 0.9 , bytestring >= 0.10.8 && < 0.11 , comonad >= 5.0.4 && < 5.1 + , constraints >= 0.11 && <0.13 , containers >= 0.5.11.0 && < 0.7 , data-fix >= 0.3.0 && < 0.4 , deepseq >= 1.4.3 && <1.5 diff --git a/src/Nix/Scope/Basic.hs b/src/Nix/Scope/Basic.hs index bf19ac6f9..983bbcd36 100644 --- a/src/Nix/Scope/Basic.hs +++ b/src/Nix/Scope/Basic.hs @@ -15,6 +15,7 @@ {-# LANGUAGE RankNTypes #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE StandaloneDeriving #-} + module Nix.Scope.Basic where import Control.Applicative diff --git a/src/Nix/Standard.hs b/src/Nix/Standard.hs index eaf7b1125..578ec92c7 100644 --- a/src/Nix/Standard.hs +++ b/src/Nix/Standard.hs @@ -8,7 +8,6 @@ {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} @@ -30,6 +29,8 @@ import Control.Monad.Reader import Control.Monad.Ref import Control.Monad.State import Data.Coerce +import Data.Constraint ( (\\) ) +import Data.Constraint.Forall ( Forall, inst ) import Data.Functor.Identity import Data.HashMap.Lazy ( HashMap ) import Data.Text ( Text ) @@ -173,8 +174,12 @@ instance HasCitations1 m v Identity where type StandardT m = Fix1T StandardTF m -instance (forall m. MonadTrans (t (Fix1T t m))) => MonadTrans (Fix1T t) where - lift = Fix1T . lift +class MonadTrans (t (Fix1T t m)) => TransAtFix1T t m + +instance MonadTrans (t (Fix1T t m)) => TransAtFix1T t m + +instance Forall (TransAtFix1T t) => MonadTrans (Fix1T t) where + lift (x :: m a) = Fix1T $ (lift \\ inst @(TransAtFix1T t) @m) x mkStandardT :: StandardTFInner (Fix1T StandardTF m) m a diff --git a/src/Nix/Thunk.hs b/src/Nix/Thunk.hs index cecb12cd4..79d9f8dc0 100644 --- a/src/Nix/Thunk.hs +++ b/src/Nix/Thunk.hs @@ -1,3 +1,7 @@ +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeApplications #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE ApplicativeDo #-} {-# LANGUAGE LambdaCase #-} @@ -18,6 +22,8 @@ import Control.Monad.Trans.State import Control.Monad.Trans.Writer import Data.Typeable ( Typeable ) import Nix.Utils.Fix1 +import Data.Constraint ( (\\) ) +import Data.Constraint.Forall ( Forall, inst ) class MonadTransWrap t where --TODO: Can we enforce that the resulting function is as linear as the provided one? @@ -47,8 +53,13 @@ instance MonadTransWrap (StateT s) where put new pure result -instance (forall m. MonadTransWrap (t (Fix1T t m))) => MonadTransWrap (Fix1T t) where - liftWrap f (Fix1T a) = Fix1T $ liftWrap f a + +class MonadTransWrap (t (Fix1T t m)) => TransWrapAtFix1T t m + +instance MonadTransWrap (t (Fix1T t m)) => TransWrapAtFix1T t m + +instance Forall (TransWrapAtFix1T t) => MonadTransWrap (Fix1T t) where + liftWrap (f :: forall x. m x -> m x) (Fix1T (a :: (t (Fix1T t m) m a))) = Fix1T $ liftWrap f a \\ inst @(TransWrapAtFix1T t) @m class ( Monad m diff --git a/src/Nix/Utils/Fix1.hs b/src/Nix/Utils/Fix1.hs index 4f853e66b..d8c72bfe1 100644 --- a/src/Nix/Utils/Fix1.hs +++ b/src/Nix/Utils/Fix1.hs @@ -7,7 +7,9 @@ {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RankNTypes #-} +{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE TypeApplications #-} {-# LANGUAGE UndecidableInstances #-} module Nix.Utils.Fix1 where @@ -30,6 +32,7 @@ import Control.Monad.Reader ( MonadReader ) import Control.Monad.State ( MonadState ) + -- | The fixpoint combinator, courtesy of Gregory Malecha. -- https://gist.github.com/gmalecha/ceb3778b9fdaa4374976e325ac8feced newtype Fix1 (t :: (k -> *) -> k -> *) (a :: k) = Fix1 { unFix1 :: t (Fix1 t) a } @@ -50,6 +53,8 @@ deriving instance MonadState s (t (Fix1 t)) => MonadState s (Fix1 t) newtype Fix1T (t :: (k -> *) -> (* -> *) -> k -> *) (m :: * -> *) (a :: k) = Fix1T { unFix1T :: t (Fix1T t m) m a } +type MonadFix1T t m = (MonadTrans (Fix1T t), Monad (t (Fix1T t m) m)) + deriving instance Functor (t (Fix1T t m) m) => Functor (Fix1T t m) deriving instance Applicative (t (Fix1T t m) m) => Applicative (Fix1T t m) deriving instance Alternative (t (Fix1T t m) m) => Alternative (Fix1T t m) @@ -65,8 +70,6 @@ deriving instance MonadMask (t (Fix1T t m) m) => MonadMask (Fix1T t m) deriving instance MonadReader e (t (Fix1T t m) m) => MonadReader e (Fix1T t m) deriving instance MonadState s (t (Fix1T t m) m) => MonadState s (Fix1T t m) -type MonadFix1T t m = (MonadTrans (Fix1T t), Monad (t (Fix1T t m) m)) - instance (MonadFix1T t m, MonadRef m) => MonadRef (Fix1T t m) where type Ref (Fix1T t m) = Ref m newRef = lift . newRef