2019-03-10 16:47:10 +01:00
|
|
|
{-# LANGUAGE CPP #-}
|
|
|
|
{-# LANGUAGE DefaultSignatures #-}
|
|
|
|
{-# LANGUAGE DeriveFunctor #-}
|
|
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
|
|
{-# LANGUAGE FlexibleInstances #-}
|
|
|
|
{-# LANGUAGE FunctionalDependencies #-}
|
|
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
|
|
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
2019-03-17 00:23:40 +01:00
|
|
|
{-# LANGUAGE RankNTypes #-}
|
2019-03-10 16:47:10 +01:00
|
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
|
|
{-# LANGUAGE UndecidableInstances #-}
|
|
|
|
|
|
|
|
{-# OPTIONS_GHC -Wno-orphans #-}
|
|
|
|
|
|
|
|
module Nix.Fresh where
|
|
|
|
|
2019-03-17 22:47:38 +01:00
|
|
|
import Control.Applicative
|
|
|
|
import Control.Monad.Base
|
|
|
|
import Control.Monad.Catch
|
|
|
|
import Control.Monad.Except
|
|
|
|
import Control.Monad.Reader
|
|
|
|
import Control.Monad.Ref
|
|
|
|
import Control.Monad.ST
|
|
|
|
import Control.Monad.State.Strict
|
|
|
|
import Control.Monad.Writer
|
|
|
|
import Data.Typeable
|
2019-03-10 16:47:10 +01:00
|
|
|
#ifdef MIN_VERSION_haskeline
|
2019-03-17 22:47:38 +01:00
|
|
|
import System.Console.Haskeline.MonadException hiding(catch)
|
2019-03-10 16:47:10 +01:00
|
|
|
#endif
|
|
|
|
|
2019-03-17 22:47:38 +01:00
|
|
|
import Nix.Var
|
|
|
|
import Nix.Thunk
|
2019-03-10 16:47:10 +01:00
|
|
|
|
2019-03-16 20:48:07 +01:00
|
|
|
newtype FreshIdT i m a = FreshIdT { unFreshIdT :: ReaderT (Var m i) m a }
|
2019-03-10 16:47:10 +01:00
|
|
|
deriving
|
|
|
|
( Functor
|
|
|
|
, Applicative
|
|
|
|
, Alternative
|
|
|
|
, Monad
|
|
|
|
, MonadPlus
|
|
|
|
, MonadFix
|
|
|
|
, MonadRef
|
|
|
|
, MonadAtomicRef
|
|
|
|
, MonadIO
|
|
|
|
, MonadCatch
|
|
|
|
, MonadThrow
|
|
|
|
#ifdef MIN_VERSION_haskeline
|
|
|
|
, MonadException
|
|
|
|
#endif
|
|
|
|
)
|
|
|
|
|
2019-03-16 20:48:07 +01:00
|
|
|
instance MonadTrans (FreshIdT i) where
|
2019-03-17 22:47:38 +01:00
|
|
|
lift = FreshIdT . lift
|
2019-03-16 20:48:07 +01:00
|
|
|
|
2019-03-16 06:54:29 +01:00
|
|
|
instance MonadBase b m => MonadBase b (FreshIdT i m) where
|
2019-03-17 22:47:38 +01:00
|
|
|
liftBase = FreshIdT . liftBase
|
2019-03-16 06:54:29 +01:00
|
|
|
|
2019-03-16 20:48:07 +01:00
|
|
|
-- instance MonadTransControl (FreshIdT i) where
|
|
|
|
-- type StT (FreshIdT i) a = StT (ReaderT (Var m i)) a
|
|
|
|
-- liftWith = defaultLiftWith FreshIdT unFreshIdT
|
|
|
|
-- restoreT = defaultRestoreT FreshIdT
|
2019-03-16 06:54:29 +01:00
|
|
|
|
2019-03-16 20:48:07 +01:00
|
|
|
-- instance MonadBaseControl b m => MonadBaseControl b (FreshIdT i m) where
|
|
|
|
-- type StM (FreshIdT i m) a = ComposeSt (FreshIdT i) m a
|
|
|
|
-- liftBaseWith = defaultLiftBaseWith
|
|
|
|
-- restoreM = defaultRestoreM
|
2019-03-16 06:54:29 +01:00
|
|
|
|
2019-03-17 00:23:40 +01:00
|
|
|
instance ( MonadVar m
|
|
|
|
, Eq i
|
|
|
|
, Ord i
|
|
|
|
, Show i
|
|
|
|
, Enum i
|
|
|
|
, Typeable i
|
|
|
|
)
|
|
|
|
=> MonadThunkId (FreshIdT i m) where
|
|
|
|
type ThunkId (FreshIdT i m) = i
|
2019-03-16 20:48:07 +01:00
|
|
|
freshId = FreshIdT $ do
|
2019-03-17 22:47:38 +01:00
|
|
|
v <- ask
|
|
|
|
atomicModifyVar v (\i -> (succ i, i))
|
2019-03-10 16:47:10 +01:00
|
|
|
|
2019-03-16 20:48:07 +01:00
|
|
|
runFreshIdT :: Functor m => Var m i -> FreshIdT i m a -> m a
|
|
|
|
runFreshIdT i m = runReaderT (unFreshIdT m) i
|
2019-03-10 16:47:10 +01:00
|
|
|
|
2019-03-17 00:23:40 +01:00
|
|
|
instance MonadThunkId m => MonadThunkId (ReaderT r m) where
|
2019-03-17 22:47:38 +01:00
|
|
|
type ThunkId (ReaderT r m) = ThunkId m
|
2019-03-17 00:23:40 +01:00
|
|
|
instance (Monoid w, MonadThunkId m) => MonadThunkId (WriterT w m) where
|
2019-03-17 22:47:38 +01:00
|
|
|
type ThunkId (WriterT w m) = ThunkId m
|
2019-03-17 00:23:40 +01:00
|
|
|
instance MonadThunkId m => MonadThunkId (ExceptT e m) where
|
2019-03-17 22:47:38 +01:00
|
|
|
type ThunkId (ExceptT e m) = ThunkId m
|
2019-03-17 00:23:40 +01:00
|
|
|
instance MonadThunkId m => MonadThunkId (StateT s m) where
|
2019-03-17 22:47:38 +01:00
|
|
|
type ThunkId (StateT s m) = ThunkId m
|
2019-03-10 16:47:10 +01:00
|
|
|
|
|
|
|
-- Orphan instance needed by Infer.hs and Lint.hs
|
|
|
|
|
|
|
|
-- Since there's no forking, it's automatically atomic.
|
|
|
|
instance MonadAtomicRef (ST s) where
|
|
|
|
atomicModifyRef r f = do
|
|
|
|
v <- readRef r
|
|
|
|
let (a, b) = f v
|
|
|
|
writeRef r a
|
|
|
|
return b
|
|
|
|
atomicModifyRef' r f = do
|
|
|
|
v <- readRef r
|
|
|
|
let (a, b) = f v
|
|
|
|
writeRef r $! a
|
|
|
|
return b
|
2019-03-17 22:47:38 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|