{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

{-# 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

-- 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
  makeAbsolutePath :: FilePath -> StdIdT m FilePath
makeAbsolutePath = m FilePath -> StdIdT m FilePath
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m FilePath -> StdIdT m FilePath)
-> (FilePath -> m FilePath) -> FilePath -> StdIdT m FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonadEffects t f m => FilePath -> m FilePath
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
FilePath -> m FilePath
makeAbsolutePath @t @f @m
  findEnvPath :: FilePath -> StdIdT m FilePath
findEnvPath      = m FilePath -> StdIdT m FilePath
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m FilePath -> StdIdT m FilePath)
-> (FilePath -> m FilePath) -> FilePath -> StdIdT m FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonadEffects t f m => FilePath -> m FilePath
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
FilePath -> m FilePath
findEnvPath @t @f @m
  findPath :: [NValue t f (StdIdT m)] -> FilePath -> StdIdT m FilePath
findPath [NValue t f (StdIdT m)]
vs FilePath
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 (Var 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' = (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
fmap ((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 =>
Var m i -> FreshIdT i m a -> m a
runFreshIdT Ref m Int
i)) [NValue t f (StdIdT m)]
vs
    m FilePath -> StdIdT m FilePath
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m FilePath -> StdIdT m FilePath)
-> m FilePath -> StdIdT m FilePath
forall a b. (a -> b) -> a -> b
$ [NValue t f m] -> FilePath -> m FilePath
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
[NValue t f m] -> FilePath -> m FilePath
findPath @t @f @m [NValue t f m]
vs' FilePath
path
  importPath :: FilePath -> StdIdT m (NValue t f (StdIdT m))
importPath FilePath
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 (Var 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
$ FilePath -> m (NValue t f m)
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
FilePath -> m (NValue t f m)
importPath @t @f @m FilePath
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 =>
Var m i -> FreshIdT i m a -> m a
runFreshIdT Ref m Int
i) NValue t f m
p
  pathToDefaultNix :: FilePath -> StdIdT m FilePath
pathToDefaultNix = m FilePath -> StdIdT m FilePath
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m FilePath -> StdIdT m FilePath)
-> (FilePath -> m FilePath) -> FilePath -> StdIdT m FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonadEffects t f m => FilePath -> m FilePath
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
FilePath -> m FilePath
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 (Var 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
$ 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 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 =>
Var 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 =>
Var m i -> FreshIdT i m a -> m a
runFreshIdT Ref m Int
i) NValue t f m
p
  traceEffect :: FilePath -> StdIdT m ()
traceEffect = m () -> StdIdT m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> StdIdT m ())
-> (FilePath -> m ()) -> FilePath -> StdIdT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MonadEffects t f m => FilePath -> m ()
forall t (f :: * -> *) (m :: * -> *).
MonadEffects t f m =>
FilePath -> m ()
traceEffect @t @f @m