Skip to content

Commit 44708b2

Browse files
committed
Eliminate use of QuantifiedConstraints to support GHC < 8.6
1 parent 45c7726 commit 44708b2

File tree

5 files changed

+28
-7
lines changed

5 files changed

+28
-7
lines changed

hnix.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ library
404404
, binary >= 0.8.5 && < 0.9
405405
, bytestring >= 0.10.8 && < 0.11
406406
, comonad >= 5.0.4 && < 5.1
407+
, constraints >= 0.11 && <0.13
407408
, containers >= 0.5.11.0 && < 0.7
408409
, data-fix >= 0.3.0 && < 0.4
409410
, deepseq >= 1.4.3 && <1.5

src/Nix/Scope/Basic.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
{-# LANGUAGE RankNTypes #-}
1616
{-# LANGUAGE GADTs #-}
1717
{-# LANGUAGE StandaloneDeriving #-}
18+
1819
module Nix.Scope.Basic where
1920

2021
import Control.Applicative

src/Nix/Standard.hs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
{-# LANGUAGE DeriveTraversable #-}
99
{-# LANGUAGE FlexibleInstances #-}
1010
{-# LANGUAGE MultiParamTypeClasses #-}
11-
{-# LANGUAGE QuantifiedConstraints #-}
1211
{-# LANGUAGE ScopedTypeVariables #-}
1312
{-# LANGUAGE TypeApplications #-}
1413
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
@@ -30,6 +29,8 @@ import Control.Monad.Reader
3029
import Control.Monad.Ref
3130
import Control.Monad.State
3231
import Data.Coerce
32+
import Data.Constraint ( (\\) )
33+
import Data.Constraint.Forall ( Forall, inst )
3334
import Data.Functor.Identity
3435
import Data.HashMap.Lazy ( HashMap )
3536
import Data.Text ( Text )
@@ -173,8 +174,12 @@ instance HasCitations1 m v Identity where
173174

174175
type StandardT m = Fix1T StandardTF m
175176

176-
instance (forall m. MonadTrans (t (Fix1T t m))) => MonadTrans (Fix1T t) where
177-
lift = Fix1T . lift
177+
class MonadTrans (t (Fix1T t m)) => TransAtFix1T t m
178+
179+
instance MonadTrans (t (Fix1T t m)) => TransAtFix1T t m
180+
181+
instance Forall (TransAtFix1T t) => MonadTrans (Fix1T t) where
182+
lift (x :: m a) = Fix1T $ (lift \\ inst @(TransAtFix1T t) @m) x
178183

179184
mkStandardT
180185
:: StandardTFInner (Fix1T StandardTF m) m a

src/Nix/Thunk.hs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
{-# LANGUAGE FlexibleInstances #-}
2+
{-# LANGUAGE MultiParamTypeClasses #-}
3+
{-# LANGUAGE ScopedTypeVariables #-}
4+
{-# LANGUAGE TypeApplications #-}
15
{-# LANGUAGE StandaloneDeriving #-}
26
{-# LANGUAGE ApplicativeDo #-}
37
{-# LANGUAGE LambdaCase #-}
@@ -18,6 +22,8 @@ import Control.Monad.Trans.State
1822
import Control.Monad.Trans.Writer
1923
import Data.Typeable ( Typeable )
2024
import Nix.Utils.Fix1
25+
import Data.Constraint ( (\\) )
26+
import Data.Constraint.Forall ( Forall, inst )
2127

2228
class MonadTransWrap t where
2329
--TODO: Can we enforce that the resulting function is as linear as the provided one?
@@ -47,8 +53,13 @@ instance MonadTransWrap (StateT s) where
4753
put new
4854
pure result
4955

50-
instance (forall m. MonadTransWrap (t (Fix1T t m))) => MonadTransWrap (Fix1T t) where
51-
liftWrap f (Fix1T a) = Fix1T $ liftWrap f a
56+
57+
class MonadTransWrap (t (Fix1T t m)) => TransWrapAtFix1T t m
58+
59+
instance MonadTransWrap (t (Fix1T t m)) => TransWrapAtFix1T t m
60+
61+
instance Forall (TransWrapAtFix1T t) => MonadTransWrap (Fix1T t) where
62+
liftWrap (f :: forall x. m x -> m x) (Fix1T (a :: (t (Fix1T t m) m a))) = Fix1T $ liftWrap f a \\ inst @(TransWrapAtFix1T t) @m
5263

5364

5465
class ( Monad m

src/Nix/Utils/Fix1.hs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
{-# LANGUAGE MultiParamTypeClasses #-}
88
{-# LANGUAGE PolyKinds #-}
99
{-# LANGUAGE RankNTypes #-}
10+
{-# LANGUAGE ScopedTypeVariables #-}
1011
{-# LANGUAGE StandaloneDeriving #-}
12+
{-# LANGUAGE TypeApplications #-}
1113
{-# LANGUAGE UndecidableInstances #-}
1214

1315
module Nix.Utils.Fix1 where
@@ -30,6 +32,7 @@ import Control.Monad.Reader ( MonadReader )
3032
import Control.Monad.State ( MonadState )
3133

3234

35+
3336
-- | The fixpoint combinator, courtesy of Gregory Malecha.
3437
-- https://gist.github.com/gmalecha/ceb3778b9fdaa4374976e325ac8feced
3538
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)
5053
newtype Fix1T (t :: (k -> *) -> (* -> *) -> k -> *) (m :: * -> *) (a :: k)
5154
= Fix1T { unFix1T :: t (Fix1T t m) m a }
5255

56+
type MonadFix1T t m = (MonadTrans (Fix1T t), Monad (t (Fix1T t m) m))
57+
5358
deriving instance Functor (t (Fix1T t m) m) => Functor (Fix1T t m)
5459
deriving instance Applicative (t (Fix1T t m) m) => Applicative (Fix1T t m)
5560
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)
6570
deriving instance MonadReader e (t (Fix1T t m) m) => MonadReader e (Fix1T t m)
6671
deriving instance MonadState s (t (Fix1T t m) m) => MonadState s (Fix1T t m)
6772

68-
type MonadFix1T t m = (MonadTrans (Fix1T t), Monad (t (Fix1T t m) m))
69-
7073
instance (MonadFix1T t m, MonadRef m) => MonadRef (Fix1T t m) where
7174
type Ref (Fix1T t m) = Ref m
7275
newRef = lift . newRef

0 commit comments

Comments
 (0)