{-# 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 = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift 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 :: String -> StdIdT m Path
findEnvPath      = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift 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)] -> Path -> StdIdT m Path
findPath [NValue t f (StdIdT m)]
vs Path
path =
    do
      Ref m Int
i <- forall i (m :: * -> *) a. ReaderT (Ref m i) m a -> FreshIdT i m a
FreshIdT forall r (m :: * -> *). MonadReader r m => m r
ask
      forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift 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 (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 (m :: * -> *) i a.
Functor m =>
FreshIdT i m a -> Ref m i -> m a
`runFreshIdT` Ref m Int
i) 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 <- forall i (m :: * -> *) a. ReaderT (Ref m i) m a -> FreshIdT i m a
FreshIdT forall r (m :: * -> *). MonadReader r m => m r
ask
      forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ 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 (m :: * -> *) i a.
Functor m =>
FreshIdT i m a -> Ref m i -> m a
`runFreshIdT` Ref m Int
i) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
Path -> m (NValue t f m)
importPath @t @f @m forall a b. (a -> b) -> a -> b
$ Path
path)

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

  traceEffect :: String -> StdIdT m ()
  traceEffect :: String -> StdIdT m ()
traceEffect = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
String -> m ()
traceEffect @t @f @m