{-# language CPP #-}
{-# options_ghc -Wno-orphans #-}
module Nix.Fresh.Basic where
#if !MIN_VERSION_base(4,13,0)
import Control.Monad.Fail ( MonadFail )
#endif
import Nix.Effects
import Nix.Render
import Nix.Fresh
import Nix.Value
type StdIdT = FreshIdT Int
instance (MonadFail m, MonadFile m) => MonadFile (StdIdT m)
instance MonadIntrospect m => MonadIntrospect (StdIdT m)
instance MonadStore m => MonadStore (StdIdT m)
instance MonadPutStr m => MonadPutStr (StdIdT m)
instance MonadHttp m => MonadHttp (StdIdT m)
instance MonadEnv m => MonadEnv (StdIdT m)
instance MonadPaths m => MonadPaths (StdIdT m)
instance MonadInstantiate m => MonadInstantiate (StdIdT m)
instance MonadExec m => MonadExec (StdIdT m)
instance (MonadEffects t f m, MonadDataContext f m)
=> MonadEffects t f (StdIdT m) where
toAbsolutePath :: Path -> StdIdT m Path
toAbsolutePath = m Path -> StdIdT m Path
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m Path -> StdIdT m Path)
-> (Path -> m Path) -> Path -> StdIdT m Path
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
Path -> m Path
toAbsolutePath @t @f @m
findEnvPath :: String -> StdIdT m Path
findEnvPath = m Path -> StdIdT m Path
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m Path -> StdIdT m Path)
-> (String -> m Path) -> String -> StdIdT m Path
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
String -> m Path
findEnvPath @t @f @m
findPath :: [NValue t f (StdIdT m)] -> Path -> StdIdT m Path
findPath [NValue t f (StdIdT m)]
vs Path
path = do
Ref m Int
i <- ReaderT (Ref m Int) m (Ref m Int) -> FreshIdT Int m (Ref m Int)
forall i (m :: * -> *) a. ReaderT (Ref m i) m a -> FreshIdT i m a
FreshIdT ReaderT (Ref m Int) m (Ref m Int)
forall r (m :: * -> *). MonadReader r m => m r
ask
let vs' :: [NValue t f m]
vs' = (forall x. FreshIdT Int m x -> m x)
-> NValue t f (StdIdT m) -> NValue t f m
forall (u :: (* -> *) -> * -> *) (m :: * -> *) (f :: * -> *) t.
(MonadTrans u, Monad m, Functor (u m), Functor f) =>
(forall x. u m x -> m x) -> NValue t f (u m) -> NValue t f m
unliftNValue (Ref m Int -> FreshIdT Int m x -> m x
forall (m :: * -> *) i a.
Functor m =>
Ref m i -> FreshIdT i m a -> m a
runFreshIdT Ref m Int
i) (NValue t f (StdIdT m) -> NValue t f m)
-> [NValue t f (StdIdT m)] -> [NValue t f m]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [NValue t f (StdIdT m)]
vs
m Path -> StdIdT m Path
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m Path -> StdIdT m Path) -> m Path -> StdIdT m Path
forall a b. (a -> b) -> a -> b
$ forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
[NValue t f m] -> Path -> m Path
findPath @t @f @m [NValue t f m]
vs' Path
path
importPath :: Path -> StdIdT m (NValue t f (StdIdT m))
importPath Path
path = do
Ref m Int
i <- ReaderT (Ref m Int) m (Ref m Int) -> FreshIdT Int m (Ref m Int)
forall i (m :: * -> *) a. ReaderT (Ref m i) m a -> FreshIdT i m a
FreshIdT ReaderT (Ref m Int) m (Ref m Int)
forall r (m :: * -> *). MonadReader r m => m r
ask
NValue t f m
p <- m (NValue t f m) -> FreshIdT Int m (NValue t f m)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (NValue t f m) -> FreshIdT Int m (NValue t f m))
-> m (NValue t f m) -> FreshIdT Int m (NValue t f m)
forall a b. (a -> b) -> a -> b
$ forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
Path -> m (NValue t f m)
importPath @t @f @m Path
path
pure $ (forall x. FreshIdT Int m x -> m x)
-> NValue t f m -> NValue t f (StdIdT m)
forall (u :: (* -> *) -> * -> *) (m :: * -> *) (f :: * -> *) t.
(MonadTrans u, Monad m, Functor (u m), Functor f) =>
(forall x. u m x -> m x) -> NValue t f m -> NValue t f (u m)
liftNValue (Ref m Int -> FreshIdT Int m x -> m x
forall (m :: * -> *) i a.
Functor m =>
Ref m i -> FreshIdT i m a -> m a
runFreshIdT Ref m Int
i) NValue t f m
p
pathToDefaultNix :: Path -> StdIdT m Path
pathToDefaultNix = m Path -> StdIdT m Path
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m Path -> StdIdT m Path)
-> (Path -> m Path) -> Path -> StdIdT m Path
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
Path -> m Path
pathToDefaultNix @t @f @m
derivationStrict :: NValue t f (StdIdT m) -> StdIdT m (NValue t f (StdIdT m))
derivationStrict NValue t f (StdIdT m)
v = do
Ref m Int
i <- ReaderT (Ref m Int) m (Ref m Int) -> FreshIdT Int m (Ref m Int)
forall i (m :: * -> *) a. ReaderT (Ref m i) m a -> FreshIdT i m a
FreshIdT ReaderT (Ref m Int) m (Ref m Int)
forall r (m :: * -> *). MonadReader r m => m r
ask
NValue t f m
p <- m (NValue t f m) -> FreshIdT Int m (NValue t f m)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (NValue t f m) -> FreshIdT Int m (NValue t f m))
-> m (NValue t f m) -> FreshIdT Int m (NValue t f m)
forall a b. (a -> b) -> a -> b
$ forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
NValue t f m -> m (NValue t f m)
derivationStrict @t @f @m (NValue t f m -> m (NValue t f m))
-> NValue t f m -> m (NValue t f m)
forall a b. (a -> b) -> a -> b
$ (forall x. FreshIdT Int m x -> m x)
-> NValue t f (StdIdT m) -> NValue t f m
forall (u :: (* -> *) -> * -> *) (m :: * -> *) (f :: * -> *) t.
(MonadTrans u, Monad m, Functor (u m), Functor f) =>
(forall x. u m x -> m x) -> NValue t f (u m) -> NValue t f m
unliftNValue (Ref m Int -> FreshIdT Int m x -> m x
forall (m :: * -> *) i a.
Functor m =>
Ref m i -> FreshIdT i m a -> m a
runFreshIdT Ref m Int
i) NValue t f (StdIdT m)
v
pure $ (forall x. FreshIdT Int m x -> m x)
-> NValue t f m -> NValue t f (StdIdT m)
forall (u :: (* -> *) -> * -> *) (m :: * -> *) (f :: * -> *) t.
(MonadTrans u, Monad m, Functor (u m), Functor f) =>
(forall x. u m x -> m x) -> NValue t f m -> NValue t f (u m)
liftNValue (Ref m Int -> FreshIdT Int m x -> m x
forall (m :: * -> *) i a.
Functor m =>
Ref m i -> FreshIdT i m a -> m a
runFreshIdT Ref m Int
i) NValue t f m
p
traceEffect :: String -> StdIdT m ()
traceEffect = m () -> StdIdT m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> StdIdT m ()) -> (String -> m ()) -> String -> StdIdT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
String -> m ()
traceEffect @t @f @m