Skip to content

Commit

Permalink
Eliminate use of QuantifiedConstraints to support GHC < 8.6
Browse files Browse the repository at this point in the history
  • Loading branch information
Anton-Latukha committed Feb 9, 2021
1 parent 45c7726 commit 44708b2
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 7 deletions.
1 change: 1 addition & 0 deletions hnix.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/Nix/Scope/Basic.hs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE StandaloneDeriving #-}

module Nix.Scope.Basic where

import Control.Applicative
Expand Down
11 changes: 8 additions & 3 deletions src/Nix/Standard.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
Expand All @@ -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 )
Expand Down Expand Up @@ -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
Expand Down
15 changes: 13 additions & 2 deletions src/Nix/Thunk.hs
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE LambdaCase #-}
Expand All @@ -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?
Expand Down Expand Up @@ -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
Expand Down
7 changes: 5 additions & 2 deletions src/Nix/Utils/Fix1.hs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}

module Nix.Utils.Fix1 where
Expand All @@ -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 }
Expand All @@ -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)
Expand All @@ -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
Expand Down

0 comments on commit 44708b2

Please sign in to comment.