{-# 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.Prelude
import           Nix.Effects
import           Nix.Render
import           Nix.Fresh
import           Nix.Value

type StdIdT = FreshIdT Int

-- NOTE: These would be removed by: https://github.com/haskell-nix/hnix/pull/804
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 :: 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
. MonadEffects t f m => Path -> m Path
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
Path -> m Path
toAbsolutePath @t @f @m

  findEnvPath :: String -> StdIdT m Path
  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
. MonadEffects t f m => String -> m Path
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)] -> 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
      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
$ [NValue t f m] -> Path -> m Path
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
[NValue t f m] -> Path -> m Path
findPath @t @f @m ((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 (FreshIdT Int m x -> Ref m Int -> m x
forall (m :: * -> *) i a.
Functor m =>
FreshIdT i m a -> Ref m i -> 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) Path
path

  importPath :: Path -> StdIdT m (NValue t f (StdIdT m))
  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
      m (NValue t f (StdIdT m)) -> StdIdT m (NValue t f (StdIdT m))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (NValue t f (StdIdT m)) -> StdIdT m (NValue t f (StdIdT m)))
-> m (NValue t f (StdIdT m)) -> StdIdT m (NValue t f (StdIdT m))
forall a b. (a -> b) -> a -> b
$ (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 (FreshIdT Int m x -> Ref m Int -> m x
forall (m :: * -> *) i a.
Functor m =>
FreshIdT i m a -> Ref m i -> m a
`runFreshIdT` Ref m Int
i) (NValue t f m -> NValue t f (StdIdT m))
-> m (NValue t f m) -> m (NValue t f (StdIdT m))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (MonadEffects t f m => Path -> m (NValue t f m)
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
Path -> m (NValue t f m)
importPath @t @f @m (Path -> m (NValue t f m)) -> Path -> m (NValue t f m)
forall a b. (a -> b) -> a -> b
$ Path
path)

  pathToDefaultNix :: Path -> StdIdT m Path
  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
. MonadEffects t f m => Path -> m Path
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) -> 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
      let
        fresh :: FreshIdT Int m a -> m a
        fresh :: FreshIdT Int m a -> m a
fresh = (FreshIdT Int m a -> Ref m Int -> m a
forall (m :: * -> *) i a.
Functor m =>
FreshIdT i m a -> Ref m i -> m a
`runFreshIdT` Ref m Int
i)
      m (NValue t f (StdIdT m)) -> StdIdT m (NValue t f (StdIdT m))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (NValue t f (StdIdT m)) -> StdIdT m (NValue t f (StdIdT m)))
-> m (NValue t f (StdIdT m)) -> StdIdT m (NValue t f (StdIdT m))
forall a b. (a -> b) -> a -> b
$ (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 forall x. FreshIdT Int m x -> m x
fresh (NValue t f m -> NValue t f (StdIdT m))
-> m (NValue t f m) -> m (NValue t f (StdIdT m))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (MonadEffects t f m => NValue t f m -> m (NValue t f m)
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 (StdIdT m) -> NValue t f m)
-> NValue t f (StdIdT m)
-> m (NValue t f m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (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 forall x. FreshIdT Int m x -> m x
fresh (NValue t f (StdIdT m) -> m (NValue t f m))
-> NValue t f (StdIdT m) -> m (NValue t f m)
forall a b. (a -> b) -> a -> b
$ NValue t f (StdIdT m)
v)

  traceEffect :: String -> StdIdT m ()
  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
. MonadEffects t f m => String -> m ()
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
String -> m ()
traceEffect @t @f @m