{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}



module Nix.Eval where

import           Control.Monad                  ( foldM )
import           Control.Monad.Fix              ( MonadFix )
import           Data.Semialign.Indexed         ( ialignWith )
import qualified Data.HashMap.Lazy             as M
import           Data.List                      ( partition )
import           Data.These                     ( These(..) )
import           Nix.Atoms
import           Nix.Convert
import           Nix.Expr
import           Nix.Expr.Strings               ( runAntiquoted )
import           Nix.Frames
import           Nix.String
import           Nix.Scope
import           Nix.Utils
import           Nix.Value.Monad

class (Show v, Monad m) => MonadEval v m where
  freeVariable    :: Text -> m v
  synHole         :: Text -> m v
  attrMissing     :: NonEmpty Text -> Maybe v -> m v
  evaledSym       :: Text -> v -> m v
  evalCurPos      :: m v
  evalConstant    :: NAtom -> m v
  evalString      :: NString (m v) -> m v
  evalLiteralPath :: FilePath -> m v
  evalEnvPath     :: FilePath -> m v
  evalUnary       :: NUnaryOp -> v -> m v
  evalBinary      :: NBinaryOp -> v -> m v -> m v
  -- ^ The second argument is an action because operators such as boolean &&
  -- and || may not evaluate the second argument.
  evalWith        :: m v -> m v -> m v
  evalIf          :: v -> m v -> m v -> m v
  evalAssert      :: v -> m v -> m v
  evalApp         :: v -> m v -> m v
  evalAbs         :: Params (m v)
                  -> ( forall a
                    . m v
                    -> ( AttrSet (m v)
                      -> m v
                      -> m (a, v)
                      )
                    -> m (a, v)
                    )
                  -> m v
{-
  evalSelect     :: v -> NonEmpty Text -> Maybe (m v) -> m v
  evalHasAttr    :: v -> NonEmpty Text -> m v

  -- | This and the following methods are intended to allow things like
  --   adding provenance information.
  evalListElem   :: [m v] -> Int -> m v -> m v
  evalList       :: [v] -> m v
  evalSetElem    :: AttrSet (m v) -> Text -> m v -> m v
  evalSet        :: AttrSet v -> AttrSet SourcePos -> m v
  evalRecSetElem :: AttrSet (m v) -> Text -> m v -> m v
  evalRecSet     :: AttrSet v -> AttrSet SourcePos -> m v
  evalLetElem    :: Text -> m v -> m v
  evalLet        :: m v -> m v
-}
  evalError :: Exception s => s -> m a

type MonadNixEval v m
  = ( MonadEval v m
  , Scoped v m
  , MonadValue v m
  , MonadFix m
  , ToValue Bool m v
  , ToValue [v] m v
  , FromValue NixString m v
  , ToValue (AttrSet v, AttrSet SourcePos) m v
  , FromValue (AttrSet v, AttrSet SourcePos) m v
  )

data EvalFrame m v
  = EvaluatingExpr (Scopes m v) NExprLoc
  | ForcingExpr (Scopes m v) NExprLoc
  | Calling Text SrcSpan
  | SynHole (SynHoleInfo m v)
  deriving (Int -> EvalFrame m v -> ShowS
[EvalFrame m v] -> ShowS
EvalFrame m v -> String
(Int -> EvalFrame m v -> ShowS)
-> (EvalFrame m v -> String)
-> ([EvalFrame m v] -> ShowS)
-> Show (EvalFrame m v)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (m :: * -> *) v. Int -> EvalFrame m v -> ShowS
forall (m :: * -> *) v. [EvalFrame m v] -> ShowS
forall (m :: * -> *) v. EvalFrame m v -> String
showList :: [EvalFrame m v] -> ShowS
$cshowList :: forall (m :: * -> *) v. [EvalFrame m v] -> ShowS
show :: EvalFrame m v -> String
$cshow :: forall (m :: * -> *) v. EvalFrame m v -> String
showsPrec :: Int -> EvalFrame m v -> ShowS
$cshowsPrec :: forall (m :: * -> *) v. Int -> EvalFrame m v -> ShowS
Show, Typeable)

instance (Typeable m, Typeable v) => Exception (EvalFrame m v)

data SynHoleInfo m v = SynHoleInfo
  { SynHoleInfo m v -> NExprLoc
_synHoleInfo_expr :: NExprLoc
  , SynHoleInfo m v -> Scopes m v
_synHoleInfo_scope :: Scopes m v
  }
  deriving (Int -> SynHoleInfo m v -> ShowS
[SynHoleInfo m v] -> ShowS
SynHoleInfo m v -> String
(Int -> SynHoleInfo m v -> ShowS)
-> (SynHoleInfo m v -> String)
-> ([SynHoleInfo m v] -> ShowS)
-> Show (SynHoleInfo m v)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (m :: * -> *) v. Int -> SynHoleInfo m v -> ShowS
forall (m :: * -> *) v. [SynHoleInfo m v] -> ShowS
forall (m :: * -> *) v. SynHoleInfo m v -> String
showList :: [SynHoleInfo m v] -> ShowS
$cshowList :: forall (m :: * -> *) v. [SynHoleInfo m v] -> ShowS
show :: SynHoleInfo m v -> String
$cshow :: forall (m :: * -> *) v. SynHoleInfo m v -> String
showsPrec :: Int -> SynHoleInfo m v -> ShowS
$cshowsPrec :: forall (m :: * -> *) v. Int -> SynHoleInfo m v -> ShowS
Show, Typeable)

instance (Typeable m, Typeable v) => Exception (SynHoleInfo m v)

-- jww (2019-03-18): By deferring only those things which must wait until
-- context of us, this can be written as:
-- eval :: forall v m . MonadNixEval v m => NExprF v -> m v
eval :: forall v m . MonadNixEval v m => NExprF (m v) -> m v

eval :: NExprF (m v) -> m v
eval (NSym VarName
"__curPos") = m v
forall v (m :: * -> *). MonadEval v m => m v
evalCurPos

eval (NSym VarName
var       ) =
  do
    Maybe v
mres <- VarName -> m (Maybe v)
forall a (m :: * -> *). Scoped a m => VarName -> m (Maybe a)
lookupVar VarName
var
    m v -> (v -> m v) -> Maybe v -> m v
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
      (VarName -> m v
forall v (m :: * -> *). MonadEval v m => VarName -> m v
freeVariable VarName
var)
      (VarName -> v -> m v
forall v (m :: * -> *). MonadEval v m => VarName -> v -> m v
evaledSym VarName
var (v -> m v) -> (v -> m v) -> v -> m v
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< v -> m v
forall v (m :: * -> *). MonadValue v m => v -> m v
demand)
      Maybe v
mres

eval (NConstant    NAtom
x      ) = NAtom -> m v
forall v (m :: * -> *). MonadEval v m => NAtom -> m v
evalConstant NAtom
x
eval (NStr         NString (m v)
str    ) = NString (m v) -> m v
forall v (m :: * -> *). MonadEval v m => NString (m v) -> m v
evalString NString (m v)
str
eval (NLiteralPath String
p      ) = String -> m v
forall v (m :: * -> *). MonadEval v m => String -> m v
evalLiteralPath String
p
eval (NEnvPath     String
p      ) = String -> m v
forall v (m :: * -> *). MonadEval v m => String -> m v
evalEnvPath String
p
eval (NUnary NUnaryOp
op m v
arg       ) = NUnaryOp -> v -> m v
forall v (m :: * -> *). MonadEval v m => NUnaryOp -> v -> m v
evalUnary NUnaryOp
op (v -> m v) -> m v -> m v
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m v
arg

eval (NBinary NBinaryOp
NApp m v
fun m v
arg) =
  do
    Scopes m v
scope <- m (Scopes m v)
forall a (m :: * -> *). Scoped a m => m (Scopes m a)
currentScopes :: m (Scopes m v)
    (v -> m v -> m v
forall v (m :: * -> *). MonadEval v m => v -> m v -> m v
`evalApp` Scopes m v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope m v
arg) (v -> m v) -> m v -> m v
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m v
fun

eval (NBinary NBinaryOp
op   m v
larg m v
rarg) = m v
larg m v -> (v -> m v) -> m v
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= NBinaryOp -> v -> m v -> m v
forall v (m :: * -> *).
MonadEval v m =>
NBinaryOp -> v -> m v -> m v
evalBinary NBinaryOp
op (v -> m v -> m v) -> m v -> v -> m v
forall (f :: * -> *) a b. Functor f => f (a -> b) -> a -> f b
?? m v
rarg

eval (NSelect m v
aset NAttrPath (m v)
attr Maybe (m v)
alt ) = m v -> NAttrPath (m v) -> m (Either (v, NonEmpty VarName) (m v))
forall v (m :: * -> *).
MonadNixEval v m =>
m v -> NAttrPath (m v) -> m (Either (v, NonEmpty VarName) (m v))
evalSelect m v
aset NAttrPath (m v)
attr m (Either (v, NonEmpty VarName) (m v))
-> (Either (v, NonEmpty VarName) (m v) -> m v) -> m v
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ((v, NonEmpty VarName) -> m v)
-> (m v -> m v) -> Either (v, NonEmpty VarName) (m v) -> m v
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (v, NonEmpty VarName) -> m v
go m v -> m v
forall a. a -> a
id
  where go :: (v, NonEmpty VarName) -> m v
go (v
s, NonEmpty VarName
ks) = m v -> Maybe (m v) -> m v
forall a. a -> Maybe a -> a
fromMaybe (NonEmpty VarName -> Maybe v -> m v
forall v (m :: * -> *).
MonadEval v m =>
NonEmpty VarName -> Maybe v -> m v
attrMissing NonEmpty VarName
ks (v -> Maybe v
forall (f :: * -> *) a. Applicative f => a -> f a
pure v
s)) Maybe (m v)
alt

eval (NHasAttr m v
aset NAttrPath (m v)
attr) = m v -> NAttrPath (m v) -> m (Either (v, NonEmpty VarName) (m v))
forall v (m :: * -> *).
MonadNixEval v m =>
m v -> NAttrPath (m v) -> m (Either (v, NonEmpty VarName) (m v))
evalSelect m v
aset NAttrPath (m v)
attr m (Either (v, NonEmpty VarName) (m v))
-> (Either (v, NonEmpty VarName) (m v) -> m v) -> m v
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Bool -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue (Bool -> m v)
-> (Either (v, NonEmpty VarName) (m v) -> Bool)
-> Either (v, NonEmpty VarName) (m v)
-> m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either (v, NonEmpty VarName) (m v) -> Bool
forall a b. Either a b -> Bool
isRight

eval (NList [m v]
l           ) =
  do
    Scopes m v
scope <- m (Scopes m v)
forall a (m :: * -> *). Scoped a m => m (Scopes m a)
currentScopes
    [v] -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue ([v] -> m v) -> m [v] -> m v
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (m v -> m v) -> [m v] -> m [v]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (MonadValue v m => m v -> m v
forall v (m :: * -> *). MonadValue v m => m v -> m v
defer @v @m (m v -> m v) -> (m v -> m v) -> m v -> m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scopes m v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes @v Scopes m v
scope) [m v]
l

eval (NSet NRecordType
NNonRecursive [Binding (m v)]
binds) =
  (AttrSet v, AttrSet SourcePos) -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue ((AttrSet v, AttrSet SourcePos) -> m v)
-> m (AttrSet v, AttrSet SourcePos) -> m v
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Bool -> [Binding (m v)] -> m (AttrSet v, AttrSet SourcePos)
forall v (m :: * -> *).
MonadNixEval v m =>
Bool -> [Binding (m v)] -> m (AttrSet v, AttrSet SourcePos)
evalBinds Bool
False (([Binding (m v)] -> m v) -> [Binding (m v)] -> [Binding (m v)]
forall r. ([Binding r] -> r) -> [Binding r] -> [Binding r]
desugarBinds (NExprF (m v) -> m v
forall v (m :: * -> *). MonadNixEval v m => NExprF (m v) -> m v
eval (NExprF (m v) -> m v)
-> ([Binding (m v)] -> NExprF (m v)) -> [Binding (m v)] -> m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NRecordType -> [Binding (m v)] -> NExprF (m v)
forall r. NRecordType -> [Binding r] -> NExprF r
NSet NRecordType
NNonRecursive) [Binding (m v)]
binds)

eval (NSet NRecordType
NRecursive [Binding (m v)]
binds) =
  (AttrSet v, AttrSet SourcePos) -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue ((AttrSet v, AttrSet SourcePos) -> m v)
-> m (AttrSet v, AttrSet SourcePos) -> m v
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Bool -> [Binding (m v)] -> m (AttrSet v, AttrSet SourcePos)
forall v (m :: * -> *).
MonadNixEval v m =>
Bool -> [Binding (m v)] -> m (AttrSet v, AttrSet SourcePos)
evalBinds Bool
True (([Binding (m v)] -> m v) -> [Binding (m v)] -> [Binding (m v)]
forall r. ([Binding r] -> r) -> [Binding r] -> [Binding r]
desugarBinds (NExprF (m v) -> m v
forall v (m :: * -> *). MonadNixEval v m => NExprF (m v) -> m v
eval (NExprF (m v) -> m v)
-> ([Binding (m v)] -> NExprF (m v)) -> [Binding (m v)] -> m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NRecordType -> [Binding (m v)] -> NExprF (m v)
forall r. NRecordType -> [Binding r] -> NExprF r
NSet NRecordType
NNonRecursive) [Binding (m v)]
binds)

eval (NLet [Binding (m v)]
binds m v
body    ) =
  do
    (AttrSet v
x, AttrSet SourcePos
_) <- Bool -> [Binding (m v)] -> m (AttrSet v, AttrSet SourcePos)
forall v (m :: * -> *).
MonadNixEval v m =>
Bool -> [Binding (m v)] -> m (AttrSet v, AttrSet SourcePos)
evalBinds Bool
True [Binding (m v)]
binds
    AttrSet v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => AttrSet a -> m r -> m r
pushScope AttrSet v
x m v
body

eval (NIf m v
cond m v
t m v
f       ) =
  do
    v
v <- m v
cond
    v -> m v -> m v -> m v
forall v (m :: * -> *). MonadEval v m => v -> m v -> m v -> m v
evalIf v
v m v
t m v
f

eval (NWith   m v
scope  m v
body) = m v -> m v -> m v
forall v (m :: * -> *). MonadEval v m => m v -> m v -> m v
evalWith m v
scope m v
body

eval (NAssert m v
cond   m v
body) =
  do
    v
x <- m v
cond
    v -> m v -> m v
forall v (m :: * -> *). MonadEval v m => v -> m v -> m v
evalAssert v
x m v
body

eval (NAbs    Params (m v)
params m v
body) = do
  -- It is the environment at the definition site, not the call site, that
  -- needs to be used when evaluating the body and default arguments, hence we
  -- defer here so the present scope is restored when the parameters and body
  -- are forced during application.
  Scopes m v
scope <- m (Scopes m v)
forall a (m :: * -> *). Scoped a m => m (Scopes m a)
currentScopes :: m (Scopes m v)
  Params (m v)
-> (forall a.
    m v -> (AttrSet (m v) -> m v -> m (a, v)) -> m (a, v))
-> m v
forall v (m :: * -> *).
MonadEval v m =>
Params (m v)
-> (forall a.
    m v -> (AttrSet (m v) -> m v -> m (a, v)) -> m (a, v))
-> m v
evalAbs Params (m v)
params ((forall a. m v -> (AttrSet (m v) -> m v -> m (a, v)) -> m (a, v))
 -> m v)
-> (forall a.
    m v -> (AttrSet (m v) -> m v -> m (a, v)) -> m (a, v))
-> m v
forall a b. (a -> b) -> a -> b
$ \m v
arg AttrSet (m v) -> m v -> m (a, v)
k -> Scopes m v -> m (a, v) -> m (a, v)
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope (m (a, v) -> m (a, v)) -> m (a, v) -> m (a, v)
forall a b. (a -> b) -> a -> b
$ do
    AttrSet v
args <- Params (m v) -> m v -> m (AttrSet v)
forall v (m :: * -> *).
MonadNixEval v m =>
Params (m v) -> m v -> m (AttrSet v)
buildArgument Params (m v)
params m v
arg
    AttrSet v -> m (a, v) -> m (a, v)
forall a (m :: * -> *) r. Scoped a m => AttrSet a -> m r -> m r
pushScope AttrSet v
args (m (a, v) -> m (a, v)) -> m (a, v) -> m (a, v)
forall a b. (a -> b) -> a -> b
$ AttrSet (m v) -> m v -> m (a, v)
k (Scopes m v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope (m v -> m v) -> (v -> m v) -> v -> m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v -> m v
forall v (m :: * -> *). MonadValue v m => v -> m v
inform (v -> m v) -> AttrSet v -> AttrSet (m v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AttrSet v
args) m v
body

eval (NSynHole VarName
name) = VarName -> m v
forall v (m :: * -> *). MonadEval v m => VarName -> m v
synHole VarName
name

-- | If you know that the 'scope' action will result in an 'AttrSet v', then
--   this implementation may be used as an implementation for 'evalWith'.
evalWithAttrSet :: forall v m . MonadNixEval v m => m v -> m v -> m v
evalWithAttrSet :: m v -> m v -> m v
evalWithAttrSet m v
aset m v
body = do
  -- The scope is deliberately wrapped in a thunk here, since it is demanded
  -- each time a name is looked up within the weak scope, and we want to be
  -- sure the action it evaluates is to force a thunk, so its value is only
  -- computed once.
  Scopes m v
scope <- m (Scopes m v)
forall a (m :: * -> *). Scoped a m => m (Scopes m a)
currentScopes :: m (Scopes m v)
  v
s     <- m v -> m v
forall v (m :: * -> *). MonadValue v m => m v -> m v
defer (m v -> m v) -> m v -> m v
forall a b. (a -> b) -> a -> b
$ Scopes m v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope m v
aset
  let s' :: m (AttrSet v)
s' = (AttrSet v, AttrSet SourcePos) -> AttrSet v
forall a b. (a, b) -> a
fst ((AttrSet v, AttrSet SourcePos) -> AttrSet v)
-> m (AttrSet v, AttrSet SourcePos) -> m (AttrSet v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall a (m :: * -> *) v. FromValue a m v => v -> m a
forall (m :: * -> *) v.
FromValue (AttrSet v, AttrSet SourcePos) m v =>
v -> m (AttrSet v, AttrSet SourcePos)
fromValue @(AttrSet v, AttrSet SourcePos) (v -> m (AttrSet v, AttrSet SourcePos))
-> m v -> m (AttrSet v, AttrSet SourcePos)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< v -> m v
forall v (m :: * -> *). MonadValue v m => v -> m v
demand v
s)

  m (AttrSet v) -> m v -> m v
forall (m :: * -> *) a r.
(Functor m, Scoped a m) =>
m (AttrSet a) -> m r -> m r
pushWeakScope m (AttrSet v)
s' m v
body

attrSetAlter
  :: forall v m
   . MonadNixEval v m
  => [Text]
  -> SourcePos
  -> AttrSet (m v)
  -> AttrSet SourcePos
  -> m v
  -> m (AttrSet (m v), AttrSet SourcePos)
attrSetAlter :: [VarName]
-> SourcePos
-> AttrSet (m v)
-> AttrSet SourcePos
-> m v
-> m (AttrSet (m v), AttrSet SourcePos)
attrSetAlter [] SourcePos
_ AttrSet (m v)
_ AttrSet SourcePos
_ m v
_ = forall v (m :: * -> *) s a.
(MonadEval v m, Exception s) =>
s -> m a
forall (m :: * -> *) s a. (MonadEval v m, Exception s) => s -> m a
evalError @v (ErrorCall -> m (AttrSet (m v), AttrSet SourcePos))
-> ErrorCall -> m (AttrSet (m v), AttrSet SourcePos)
forall a b. (a -> b) -> a -> b
$ String -> ErrorCall
ErrorCall String
"invalid selector with no components"
attrSetAlter (VarName
k : [VarName]
ks) SourcePos
pos AttrSet (m v)
m AttrSet SourcePos
p m v
val =
  m (AttrSet (m v), AttrSet SourcePos)
-> m (AttrSet (m v), AttrSet SourcePos)
-> Bool
-> m (AttrSet (m v), AttrSet SourcePos)
forall a. a -> a -> Bool -> a
bool
    m (AttrSet (m v), AttrSet SourcePos)
go
    (m (AttrSet (m v), AttrSet SourcePos)
-> (m v -> m (AttrSet (m v), AttrSet SourcePos))
-> Maybe (m v)
-> m (AttrSet (m v), AttrSet SourcePos)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
      (AttrSet (m v)
-> AttrSet SourcePos -> m (AttrSet (m v), AttrSet SourcePos)
recurse AttrSet (m v)
forall a. Monoid a => a
mempty AttrSet SourcePos
forall a. Monoid a => a
mempty)
      (\m v
x ->
        do
          (AttrSet v
st, AttrSet SourcePos
sp) <- forall a (m :: * -> *) v. FromValue a m v => v -> m a
forall (m :: * -> *) v.
FromValue (AttrSet v, AttrSet SourcePos) m v =>
v -> m (AttrSet v, AttrSet SourcePos)
fromValue @(AttrSet v, AttrSet SourcePos) (v -> m (AttrSet v, AttrSet SourcePos))
-> m v -> m (AttrSet v, AttrSet SourcePos)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m v
x
          AttrSet (m v)
-> AttrSet SourcePos -> m (AttrSet (m v), AttrSet SourcePos)
recurse (v -> m v
forall v (m :: * -> *). MonadValue v m => v -> m v
demand (v -> m v) -> AttrSet v -> AttrSet (m v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AttrSet v
st) AttrSet SourcePos
sp
      )
      (VarName -> AttrSet (m v) -> Maybe (m v)
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup VarName
k AttrSet (m v)
m)
    )
    (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [VarName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [VarName]
ks)
 where
  go :: m (AttrSet (m v), AttrSet SourcePos)
go = (AttrSet (m v), AttrSet SourcePos)
-> m (AttrSet (m v), AttrSet SourcePos)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (VarName -> m v -> AttrSet (m v) -> AttrSet (m v)
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert VarName
k m v
val AttrSet (m v)
m, VarName -> SourcePos -> AttrSet SourcePos -> AttrSet SourcePos
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert VarName
k SourcePos
pos AttrSet SourcePos
p)

  recurse :: AttrSet (m v)
-> AttrSet SourcePos -> m (AttrSet (m v), AttrSet SourcePos)
recurse AttrSet (m v)
st AttrSet SourcePos
sp =
    (\(AttrSet (m v)
st', AttrSet SourcePos
_) ->
      (VarName -> m v -> AttrSet (m v) -> AttrSet (m v)
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert
        VarName
k
        (forall a (m :: * -> *) v. ToValue a m v => a -> m v
forall (m :: * -> *) v.
ToValue (AttrSet v, AttrSet SourcePos) m v =>
(AttrSet v, AttrSet SourcePos) -> m v
toValue @(AttrSet v, AttrSet SourcePos) ((AttrSet v, AttrSet SourcePos) -> m v)
-> m (AttrSet v, AttrSet SourcePos) -> m v
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (, AttrSet SourcePos
forall a. Monoid a => a
mempty) (AttrSet v -> (AttrSet v, AttrSet SourcePos))
-> m (AttrSet v) -> m (AttrSet v, AttrSet SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AttrSet (m v) -> m (AttrSet v)
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence AttrSet (m v)
st')
        AttrSet (m v)
m
      , VarName -> SourcePos -> AttrSet SourcePos -> AttrSet SourcePos
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert VarName
k SourcePos
pos AttrSet SourcePos
p
      )
    ) ((AttrSet (m v), AttrSet SourcePos)
 -> (AttrSet (m v), AttrSet SourcePos))
-> m (AttrSet (m v), AttrSet SourcePos)
-> m (AttrSet (m v), AttrSet SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [VarName]
-> SourcePos
-> AttrSet (m v)
-> AttrSet SourcePos
-> m v
-> m (AttrSet (m v), AttrSet SourcePos)
forall v (m :: * -> *).
MonadNixEval v m =>
[VarName]
-> SourcePos
-> AttrSet (m v)
-> AttrSet SourcePos
-> m v
-> m (AttrSet (m v), AttrSet SourcePos)
attrSetAlter [VarName]
ks SourcePos
pos AttrSet (m v)
st AttrSet SourcePos
sp m v
val

desugarBinds :: forall r . ([Binding r] -> r) -> [Binding r] -> [Binding r]
desugarBinds :: ([Binding r] -> r) -> [Binding r] -> [Binding r]
desugarBinds [Binding r] -> r
embed [Binding r]
binds = State (HashMap VarName (SourcePos, [Binding r])) [Binding r]
-> HashMap VarName (SourcePos, [Binding r]) -> [Binding r]
forall s a. State s a -> s -> a
evalState ((Binding r
 -> StateT
      (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r))
-> [Binding r]
-> State (HashMap VarName (SourcePos, [Binding r])) [Binding r]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (Either VarName (Binding r)
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
go (Either VarName (Binding r)
 -> StateT
      (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r))
-> (Binding r
    -> StateT
         (HashMap VarName (SourcePos, [Binding r]))
         Identity
         (Either VarName (Binding r)))
-> Binding r
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Binding r
-> StateT
     (HashMap VarName (SourcePos, [Binding r]))
     Identity
     (Either VarName (Binding r))
collect) [Binding r]
binds) HashMap VarName (SourcePos, [Binding r])
forall a. Monoid a => a
mempty
 where
  collect
    :: Binding r
    -> State
         (HashMap VarName (SourcePos, [Binding r]))
         (Either VarName (Binding r))
  collect :: Binding r
-> StateT
     (HashMap VarName (SourcePos, [Binding r]))
     Identity
     (Either VarName (Binding r))
collect (NamedVar (StaticKey VarName
x :| NKeyName r
y : [NKeyName r]
ys) r
val SourcePos
p) =
    do
      HashMap VarName (SourcePos, [Binding r])
m <- StateT
  (HashMap VarName (SourcePos, [Binding r]))
  Identity
  (HashMap VarName (SourcePos, [Binding r]))
forall s (m :: * -> *). MonadState s m => m s
get
      HashMap VarName (SourcePos, [Binding r])
-> StateT (HashMap VarName (SourcePos, [Binding r])) Identity ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put (HashMap VarName (SourcePos, [Binding r])
 -> StateT (HashMap VarName (SourcePos, [Binding r])) Identity ())
-> HashMap VarName (SourcePos, [Binding r])
-> StateT (HashMap VarName (SourcePos, [Binding r])) Identity ()
forall a b. (a -> b) -> a -> b
$ VarName
-> (SourcePos, [Binding r])
-> HashMap VarName (SourcePos, [Binding r])
-> HashMap VarName (SourcePos, [Binding r])
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert VarName
x ((SourcePos, [Binding r])
 -> HashMap VarName (SourcePos, [Binding r])
 -> HashMap VarName (SourcePos, [Binding r]))
-> HashMap VarName (SourcePos, [Binding r])
-> (SourcePos, [Binding r])
-> HashMap VarName (SourcePos, [Binding r])
forall (f :: * -> *) a b. Functor f => f (a -> b) -> a -> f b
?? HashMap VarName (SourcePos, [Binding r])
m ((SourcePos, [Binding r])
 -> HashMap VarName (SourcePos, [Binding r]))
-> (SourcePos, [Binding r])
-> HashMap VarName (SourcePos, [Binding r])
forall a b. (a -> b) -> a -> b
$
        (SourcePos, [Binding r])
-> ((SourcePos, [Binding r]) -> (SourcePos, [Binding r]))
-> Maybe (SourcePos, [Binding r])
-> (SourcePos, [Binding r])
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
          (SourcePos
p, [NonEmpty (NKeyName r) -> r -> SourcePos -> Binding r
forall r. NAttrPath r -> r -> SourcePos -> Binding r
NamedVar (NKeyName r
y NKeyName r -> [NKeyName r] -> NonEmpty (NKeyName r)
forall a. a -> [a] -> NonEmpty a
:| [NKeyName r]
ys) r
val SourcePos
p])
          (\ (SourcePos
q, [Binding r]
v) -> (SourcePos
q, NonEmpty (NKeyName r) -> r -> SourcePos -> Binding r
forall r. NAttrPath r -> r -> SourcePos -> Binding r
NamedVar (NKeyName r
y NKeyName r -> [NKeyName r] -> NonEmpty (NKeyName r)
forall a. a -> [a] -> NonEmpty a
:| [NKeyName r]
ys) r
val SourcePos
q Binding r -> [Binding r] -> [Binding r]
forall a. a -> [a] -> [a]
: [Binding r]
v))
          (VarName
-> HashMap VarName (SourcePos, [Binding r])
-> Maybe (SourcePos, [Binding r])
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup VarName
x HashMap VarName (SourcePos, [Binding r])
m)
      pure $ VarName -> Either VarName (Binding r)
forall a b. a -> Either a b
Left VarName
x
  collect Binding r
x = Either VarName (Binding r)
-> StateT
     (HashMap VarName (SourcePos, [Binding r]))
     Identity
     (Either VarName (Binding r))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either VarName (Binding r)
 -> StateT
      (HashMap VarName (SourcePos, [Binding r]))
      Identity
      (Either VarName (Binding r)))
-> Either VarName (Binding r)
-> StateT
     (HashMap VarName (SourcePos, [Binding r]))
     Identity
     (Either VarName (Binding r))
forall a b. (a -> b) -> a -> b
$ Binding r -> Either VarName (Binding r)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Binding r
x

  go
    :: Either VarName (Binding r)
    -> State (HashMap VarName (SourcePos, [Binding r])) (Binding r)
  go :: Either VarName (Binding r)
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
go =
    (VarName
 -> StateT
      (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r))
-> (Binding r
    -> StateT
         (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r))
-> Either VarName (Binding r)
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either
      (\ VarName
x -> do
        Maybe (SourcePos, [Binding r])
maybeValue <- (HashMap VarName (SourcePos, [Binding r])
 -> Maybe (SourcePos, [Binding r]))
-> StateT
     (HashMap VarName (SourcePos, [Binding r]))
     Identity
     (Maybe (SourcePos, [Binding r]))
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets (VarName
-> HashMap VarName (SourcePos, [Binding r])
-> Maybe (SourcePos, [Binding r])
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup VarName
x)
        StateT
  (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
-> ((SourcePos, [Binding r])
    -> StateT
         (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r))
-> Maybe (SourcePos, [Binding r])
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
          (VarName
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
forall a t. (HasCallStack, IsText t) => t -> a
error (VarName
 -> StateT
      (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r))
-> VarName
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
forall a b. (a -> b) -> a -> b
$ VarName
"No binding " VarName -> VarName -> VarName
forall a. Semigroup a => a -> a -> a
<> VarName -> VarName
forall b a. (Show a, IsString b) => a -> b
show VarName
x)
          (\ (SourcePos
p, [Binding r]
v) -> Binding r
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Binding r
 -> StateT
      (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r))
-> Binding r
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
forall a b. (a -> b) -> a -> b
$ NonEmpty (NKeyName r) -> r -> SourcePos -> Binding r
forall r. NAttrPath r -> r -> SourcePos -> Binding r
NamedVar (VarName -> NKeyName r
forall r. VarName -> NKeyName r
StaticKey VarName
x NKeyName r -> [NKeyName r] -> NonEmpty (NKeyName r)
forall a. a -> [a] -> NonEmpty a
:| []) ([Binding r] -> r
embed [Binding r]
v) SourcePos
p)
          Maybe (SourcePos, [Binding r])
maybeValue
      )
      Binding r
-> StateT
     (HashMap VarName (SourcePos, [Binding r])) Identity (Binding r)
forall (f :: * -> *) a. Applicative f => a -> f a
pure

evalBinds
  :: forall v m
   . MonadNixEval v m
  => Bool
  -> [Binding (m v)]
  -> m (AttrSet v, AttrSet SourcePos)
evalBinds :: Bool -> [Binding (m v)] -> m (AttrSet v, AttrSet SourcePos)
evalBinds Bool
recursive [Binding (m v)]
binds =
  do
    Scopes m v
scope <- m (Scopes m v)
forall a (m :: * -> *). Scoped a m => m (Scopes m a)
currentScopes :: m (Scopes m v)

    Scopes m v
-> [([VarName], SourcePos, m v)]
-> m (AttrSet v, AttrSet SourcePos)
buildResult Scopes m v
scope ([([VarName], SourcePos, m v)] -> m (AttrSet v, AttrSet SourcePos))
-> ([[([VarName], SourcePos, m v)]]
    -> [([VarName], SourcePos, m v)])
-> [[([VarName], SourcePos, m v)]]
-> m (AttrSet v, AttrSet SourcePos)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[([VarName], SourcePos, m v)]] -> [([VarName], SourcePos, m v)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[([VarName], SourcePos, m v)]]
 -> m (AttrSet v, AttrSet SourcePos))
-> m [[([VarName], SourcePos, m v)]]
-> m (AttrSet v, AttrSet SourcePos)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Binding (m v) -> m [([VarName], SourcePos, m v)])
-> [Binding (m v)] -> m [[([VarName], SourcePos, m v)]]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (Scopes m v -> Binding (m v) -> m [([VarName], SourcePos, m v)]
applyBindToAdt Scopes m v
scope) ([Binding (m v)] -> [Binding (m v)]
forall r. [Binding r] -> [Binding r]
moveOverridesLast [Binding (m v)]
binds)

 where
  buildResult
    :: Scopes m v
    -> [([Text], SourcePos, m v)]
    -> m (AttrSet v, AttrSet SourcePos)
  buildResult :: Scopes m v
-> [([VarName], SourcePos, m v)]
-> m (AttrSet v, AttrSet SourcePos)
buildResult Scopes m v
scope [([VarName], SourcePos, m v)]
bindings =
    do
      (AttrSet (m v)
s, AttrSet SourcePos
p) <- ((AttrSet (m v), AttrSet SourcePos)
 -> ([VarName], SourcePos, m v)
 -> m (AttrSet (m v), AttrSet SourcePos))
-> (AttrSet (m v), AttrSet SourcePos)
-> [([VarName], SourcePos, m v)]
-> m (AttrSet (m v), AttrSet SourcePos)
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldM (AttrSet (m v), AttrSet SourcePos)
-> ([VarName], SourcePos, m v)
-> m (AttrSet (m v), AttrSet SourcePos)
forall v (m :: * -> *).
(MonadEval v m, Scoped v m, MonadValue v m, MonadFix m,
 ToValue (AttrSet v, AttrSet SourcePos) m v, ToValue [v] m v,
 ToValue Bool m v, FromValue (AttrSet v, AttrSet SourcePos) m v,
 FromValue NixString m v) =>
(AttrSet (m v), AttrSet SourcePos)
-> ([VarName], SourcePos, m v)
-> m (AttrSet (m v), AttrSet SourcePos)
insert (AttrSet (m v)
forall a. Monoid a => a
mempty, AttrSet SourcePos
forall a. Monoid a => a
mempty) [([VarName], SourcePos, m v)]
bindings
      AttrSet v
res <-
        m (AttrSet v) -> m (AttrSet v) -> Bool -> m (AttrSet v)
forall a. a -> a -> Bool -> a
bool
          ((m v -> m v) -> AttrSet (m v) -> m (AttrSet v)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse m v -> m v
mkThunk AttrSet (m v)
s)
          (HashMap VarName (AttrSet v -> m v) -> m (AttrSet v)
forall (m :: * -> *) (t :: * -> *) a.
(MonadFix m, Traversable t) =>
t (t a -> m a) -> m (t a)
loebM (HashMap VarName (AttrSet v -> m v) -> m (AttrSet v))
-> HashMap VarName (AttrSet v -> m v) -> m (AttrSet v)
forall a b. (a -> b) -> a -> b
$ m v -> AttrSet v -> m v
forall a. Scoped a m => m v -> AttrSet a -> m v
encapsulate (m v -> AttrSet v -> m v)
-> AttrSet (m v) -> HashMap VarName (AttrSet v -> m v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AttrSet (m v)
s)
          Bool
recursive

      pure (AttrSet v
res, AttrSet SourcePos
p)

   where
    mkThunk :: m v -> m v
mkThunk = m v -> m v
forall v (m :: * -> *). MonadValue v m => m v -> m v
defer (m v -> m v) -> (m v -> m v) -> m v -> m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scopes m v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope

    encapsulate :: m v -> AttrSet a -> m v
encapsulate m v
f AttrSet a
attrs = m v -> m v
mkThunk (m v -> m v) -> m v -> m v
forall a b. (a -> b) -> a -> b
$ AttrSet a -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => AttrSet a -> m r -> m r
pushScope AttrSet a
attrs m v
f

    insert :: (AttrSet (m v), AttrSet SourcePos)
-> ([VarName], SourcePos, m v)
-> m (AttrSet (m v), AttrSet SourcePos)
insert (AttrSet (m v)
m, AttrSet SourcePos
p) ([VarName]
path, SourcePos
pos, m v
value) = [VarName]
-> SourcePos
-> AttrSet (m v)
-> AttrSet SourcePos
-> m v
-> m (AttrSet (m v), AttrSet SourcePos)
forall v (m :: * -> *).
MonadNixEval v m =>
[VarName]
-> SourcePos
-> AttrSet (m v)
-> AttrSet SourcePos
-> m v
-> m (AttrSet (m v), AttrSet SourcePos)
attrSetAlter [VarName]
path SourcePos
pos AttrSet (m v)
m AttrSet SourcePos
p m v
value

  applyBindToAdt :: Scopes m v -> Binding (m v) -> m [([Text], SourcePos, m v)]
  applyBindToAdt :: Scopes m v -> Binding (m v) -> m [([VarName], SourcePos, m v)]
applyBindToAdt Scopes m v
_ (NamedVar (StaticKey VarName
"__overrides" :| []) m v
finalValue SourcePos
pos) =
    do
      (AttrSet v
o', AttrSet SourcePos
p') <- v -> m (AttrSet v, AttrSet SourcePos)
forall a (m :: * -> *) v. FromValue a m v => v -> m a
fromValue (v -> m (AttrSet v, AttrSet SourcePos))
-> m v -> m (AttrSet v, AttrSet SourcePos)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m v
finalValue
      -- jww (2018-05-09): What to do with the key position here?
      [([VarName], SourcePos, m v)] -> m [([VarName], SourcePos, m v)]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([([VarName], SourcePos, m v)] -> m [([VarName], SourcePos, m v)])
-> [([VarName], SourcePos, m v)] -> m [([VarName], SourcePos, m v)]
forall a b. (a -> b) -> a -> b
$
        (\ (VarName
k, v
v) ->
          ( [VarName
k]
          , SourcePos -> Maybe SourcePos -> SourcePos
forall a. a -> Maybe a -> a
fromMaybe SourcePos
pos (VarName -> AttrSet SourcePos -> Maybe SourcePos
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup VarName
k AttrSet SourcePos
p')
          , v -> m v
forall v (m :: * -> *). MonadValue v m => v -> m v
demand v
v
          )
        ) ((VarName, v) -> ([VarName], SourcePos, m v))
-> [(VarName, v)] -> [([VarName], SourcePos, m v)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AttrSet v -> [(VarName, v)]
forall k v. HashMap k v -> [(k, v)]
M.toList AttrSet v
o'

  applyBindToAdt Scopes m v
_ (NamedVar NonEmpty (NKeyName (m v))
pathExpr m v
finalValue SourcePos
pos) =
    (\case
      -- When there are no path segments, e.g. `${null} = 5;`, we don't
      -- bind anything
      ([], SourcePos
_, m v
_) -> [([VarName], SourcePos, m v)]
forall a. Monoid a => a
mempty
      ([VarName], SourcePos, m v)
result     -> [([VarName], SourcePos, m v)
result]
    ) (([VarName], SourcePos, m v) -> [([VarName], SourcePos, m v)])
-> m ([VarName], SourcePos, m v) -> m [([VarName], SourcePos, m v)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty (NKeyName (m v)) -> m ([VarName], SourcePos, m v)
processAttrSetKeys NonEmpty (NKeyName (m v))
pathExpr

   where
    processAttrSetKeys :: NAttrPath (m v) -> m ([Text], SourcePos, m v)
    processAttrSetKeys :: NonEmpty (NKeyName (m v)) -> m ([VarName], SourcePos, m v)
processAttrSetKeys =
      \case
        NKeyName (m v)
h :| [NKeyName (m v)]
t ->
          m ([VarName], SourcePos, m v)
-> (VarName -> m ([VarName], SourcePos, m v))
-> Maybe VarName
-> m ([VarName], SourcePos, m v)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
            -- Empty attrset - return a stub.
            (([VarName], SourcePos, m v) -> m ([VarName], SourcePos, m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ( [VarName]
forall a. Monoid a => a
mempty, SourcePos
nullPos, (AttrSet v, AttrSet SourcePos) -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue @(AttrSet v, AttrSet SourcePos) (AttrSet v
forall a. Monoid a => a
mempty, AttrSet SourcePos
forall a. Monoid a => a
mempty)) )
            (\ VarName
k ->
              m ([VarName], SourcePos, m v)
-> ([NKeyName (m v)] -> m ([VarName], SourcePos, m v))
-> [NKeyName (m v)]
-> m ([VarName], SourcePos, m v)
forall (t :: * -> *) b a. Foldable t => b -> (t a -> b) -> t a -> b
list
                -- No more keys in the attrset - return the result
                (([VarName], SourcePos, m v) -> m ([VarName], SourcePos, m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ( [VarName
k], SourcePos
pos, m v
finalValue ) )
                -- There are unprocessed keys in attrset - recurse appending the results
                (\ (NKeyName (m v)
x : [NKeyName (m v)]
xs) ->
                  do
                    ([VarName]
restOfPath, SourcePos
_, m v
v) <- NonEmpty (NKeyName (m v)) -> m ([VarName], SourcePos, m v)
processAttrSetKeys (NKeyName (m v)
x NKeyName (m v) -> [NKeyName (m v)] -> NonEmpty (NKeyName (m v))
forall a. a -> [a] -> NonEmpty a
:| [NKeyName (m v)]
xs)
                    ([VarName], SourcePos, m v) -> m ([VarName], SourcePos, m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ( VarName
k VarName -> [VarName] -> [VarName]
forall a. a -> [a] -> [a]
: [VarName]
restOfPath, SourcePos
pos, m v
v )
                )
                [NKeyName (m v)]
t
            )
            (Maybe VarName -> m ([VarName], SourcePos, m v))
-> m (Maybe VarName) -> m ([VarName], SourcePos, m v)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< NKeyName (m v) -> m (Maybe VarName)
forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m (Maybe VarName)
evalSetterKeyName NKeyName (m v)
h

  applyBindToAdt Scopes m v
scope (Inherit Maybe (m v)
ms [NKeyName (m v)]
names SourcePos
pos) =
    [Maybe ([VarName], SourcePos, m v)]
-> [([VarName], SourcePos, m v)]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe ([VarName], SourcePos, m v)]
 -> [([VarName], SourcePos, m v)])
-> m [Maybe ([VarName], SourcePos, m v)]
-> m [([VarName], SourcePos, m v)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
      (NKeyName (m v) -> m (Maybe ([VarName], SourcePos, m v)))
-> [NKeyName (m v)] -> m [Maybe ([VarName], SourcePos, m v)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse
        NKeyName (m v) -> m (Maybe ([VarName], SourcePos, m v))
processScope
        [NKeyName (m v)]
names
   where
    processScope
      :: NKeyName (m v)
      -> m (Maybe ([Text], SourcePos, m v))
    processScope :: NKeyName (m v) -> m (Maybe ([VarName], SourcePos, m v))
processScope NKeyName (m v)
nkeyname =
      (\ Maybe VarName
mkey ->
        do
          VarName
key <- Maybe VarName
mkey
          pure
            ([VarName
key]
            , SourcePos
pos
            , m v -> (v -> m v) -> Maybe v -> m v
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
                (NonEmpty VarName -> Maybe v -> m v
forall v (m :: * -> *).
MonadEval v m =>
NonEmpty VarName -> Maybe v -> m v
attrMissing (VarName
key VarName -> [VarName] -> NonEmpty VarName
forall a. a -> [a] -> NonEmpty a
:| []) Maybe v
forall a. Maybe a
Nothing)
                v -> m v
forall v (m :: * -> *). MonadValue v m => v -> m v
demand
                (Maybe v -> m v) -> m (Maybe v) -> m v
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m (Maybe v) -> (m v -> m (Maybe v)) -> Maybe (m v) -> m (Maybe v)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
                    (Scopes m v -> m (Maybe v) -> m (Maybe v)
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope (m (Maybe v) -> m (Maybe v)) -> m (Maybe v) -> m (Maybe v)
forall a b. (a -> b) -> a -> b
$ VarName -> m (Maybe v)
forall a (m :: * -> *). Scoped a m => VarName -> m (Maybe a)
lookupVar VarName
key)
                    (\ m v
s ->
                      do
                        (AttrSet v
attrset, AttrSet SourcePos
_) <- forall a (m :: * -> *) v. FromValue a m v => v -> m a
forall (m :: * -> *) v.
FromValue (AttrSet v, AttrSet SourcePos) m v =>
v -> m (AttrSet v, AttrSet SourcePos)
fromValue @(AttrSet v, AttrSet SourcePos) (v -> m (AttrSet v, AttrSet SourcePos))
-> m v -> m (AttrSet v, AttrSet SourcePos)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m v
s

                        forall a (m :: * -> *) r. Scoped a m => m r -> m r
forall (m :: * -> *) r. Scoped v m => m r -> m r
clearScopes @v (m (Maybe v) -> m (Maybe v)) -> m (Maybe v) -> m (Maybe v)
forall a b. (a -> b) -> a -> b
$ AttrSet v -> m (Maybe v) -> m (Maybe v)
forall a (m :: * -> *) r. Scoped a m => AttrSet a -> m r -> m r
pushScope AttrSet v
attrset (m (Maybe v) -> m (Maybe v)) -> m (Maybe v) -> m (Maybe v)
forall a b. (a -> b) -> a -> b
$ VarName -> m (Maybe v)
forall a (m :: * -> *). Scoped a m => VarName -> m (Maybe a)
lookupVar VarName
key
                    )
                    Maybe (m v)
ms
            )
      ) (Maybe VarName -> Maybe ([VarName], SourcePos, m v))
-> m (Maybe VarName) -> m (Maybe ([VarName], SourcePos, m v))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
        NKeyName (m v) -> m (Maybe VarName)
forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m (Maybe VarName)
evalSetterKeyName NKeyName (m v)
nkeyname

  moveOverridesLast :: [Binding r] -> [Binding r]
moveOverridesLast = ([Binding r] -> [Binding r] -> [Binding r])
-> ([Binding r], [Binding r]) -> [Binding r]
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry [Binding r] -> [Binding r] -> [Binding r]
forall a. Semigroup a => a -> a -> a
(<>) (([Binding r], [Binding r]) -> [Binding r])
-> ([Binding r] -> ([Binding r], [Binding r]))
-> [Binding r]
-> [Binding r]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Binding r -> Bool) -> [Binding r] -> ([Binding r], [Binding r])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition
    (\case
      NamedVar (StaticKey VarName
"__overrides" :| []) r
_ SourcePos
_pos -> Bool
False
      Binding r
_ -> Bool
True
    )

evalSelect
  :: forall v m
   . MonadNixEval v m
  => m v
  -> NAttrPath (m v)
  -> m (Either (v, NonEmpty Text) (m v))
evalSelect :: m v -> NAttrPath (m v) -> m (Either (v, NonEmpty VarName) (m v))
evalSelect m v
aset NAttrPath (m v)
attr =
  do
    v
s    <- m v
aset
    NonEmpty VarName
path <- (NKeyName (m v) -> m VarName)
-> NAttrPath (m v) -> m (NonEmpty VarName)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse NKeyName (m v) -> m VarName
forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m VarName
evalGetterKeyName NAttrPath (m v)
attr

    v -> NonEmpty VarName -> m (Either (v, NonEmpty VarName) (m v))
forall (m :: * -> *).
(Monad m, FromValue (AttrSet v, AttrSet SourcePos) m v,
 MonadValue v m, ToValue (AttrSet v, AttrSet SourcePos) m v) =>
v -> NonEmpty VarName -> m (Either (v, NonEmpty VarName) (m v))
extract v
s NonEmpty VarName
path

 where
  extract :: v -> NonEmpty VarName -> m (Either (v, NonEmpty VarName) (m v))
extract v
x path :: NonEmpty VarName
path@(VarName
k :| [VarName]
ks) =
    do
      Maybe (AttrSet v, AttrSet SourcePos)
x' <- v -> m (Maybe (AttrSet v, AttrSet SourcePos))
forall a (m :: * -> *) v. FromValue a m v => v -> m (Maybe a)
fromValueMay v
x

      case Maybe (AttrSet v, AttrSet SourcePos)
x' of
        Maybe (AttrSet v, AttrSet SourcePos)
Nothing -> Either (v, NonEmpty VarName) (m v)
-> m (Either (v, NonEmpty VarName) (m v))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either (v, NonEmpty VarName) (m v)
 -> m (Either (v, NonEmpty VarName) (m v)))
-> Either (v, NonEmpty VarName) (m v)
-> m (Either (v, NonEmpty VarName) (m v))
forall a b. (a -> b) -> a -> b
$ (v, NonEmpty VarName) -> Either (v, NonEmpty VarName) (m v)
forall a b. a -> Either a b
Left (v
x, NonEmpty VarName
path)
        Just (AttrSet v
s :: AttrSet v, AttrSet SourcePos
p :: AttrSet SourcePos)
          | Just v
t <- VarName -> AttrSet v -> Maybe v
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup VarName
k AttrSet v
s ->
            do
              (m v -> m (Either (v, NonEmpty VarName) (m v)))
-> ([VarName] -> m v -> m (Either (v, NonEmpty VarName) (m v)))
-> [VarName]
-> m v
-> m (Either (v, NonEmpty VarName) (m v))
forall (t :: * -> *) b a. Foldable t => b -> (t a -> b) -> t a -> b
list
                (Either (v, NonEmpty VarName) (m v)
-> m (Either (v, NonEmpty VarName) (m v))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either (v, NonEmpty VarName) (m v)
 -> m (Either (v, NonEmpty VarName) (m v)))
-> (m v -> Either (v, NonEmpty VarName) (m v))
-> m v
-> m (Either (v, NonEmpty VarName) (m v))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m v -> Either (v, NonEmpty VarName) (m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure)
                (\ (VarName
y : [VarName]
ys) -> ((v -> NonEmpty VarName -> m (Either (v, NonEmpty VarName) (m v))
extract (v -> NonEmpty VarName -> m (Either (v, NonEmpty VarName) (m v)))
-> NonEmpty VarName -> v -> m (Either (v, NonEmpty VarName) (m v))
forall (f :: * -> *) a b. Functor f => f (a -> b) -> a -> f b
?? (VarName
y VarName -> [VarName] -> NonEmpty VarName
forall a. a -> [a] -> NonEmpty a
:| [VarName]
ys)) (v -> m (Either (v, NonEmpty VarName) (m v)))
-> m v -> m (Either (v, NonEmpty VarName) (m v))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<))
                [VarName]
ks
                (m v -> m (Either (v, NonEmpty VarName) (m v)))
-> m v -> m (Either (v, NonEmpty VarName) (m v))
forall a b. (a -> b) -> a -> b
$ v -> m v
forall v (m :: * -> *). MonadValue v m => v -> m v
demand v
t
          | Bool
otherwise -> (v, NonEmpty VarName) -> Either (v, NonEmpty VarName) (m v)
forall a b. a -> Either a b
Left ((v, NonEmpty VarName) -> Either (v, NonEmpty VarName) (m v))
-> (v -> (v, NonEmpty VarName))
-> v
-> Either (v, NonEmpty VarName) (m v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (, NonEmpty VarName
path) (v -> Either (v, NonEmpty VarName) (m v))
-> m v -> m (Either (v, NonEmpty VarName) (m v))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (AttrSet v, AttrSet SourcePos) -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue (AttrSet v
s, AttrSet SourcePos
p)

-- | Evaluate a component of an attribute path in a context where we are
-- *retrieving* a value
evalGetterKeyName
  :: forall v m
   . (MonadEval v m, FromValue NixString m v)
  => NKeyName (m v)
  -> m Text
evalGetterKeyName :: NKeyName (m v) -> m VarName
evalGetterKeyName =
  m VarName -> (VarName -> m VarName) -> Maybe VarName -> m VarName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
    (forall v (m :: * -> *) s a.
(MonadEval v m, Exception s) =>
s -> m a
forall (m :: * -> *) s a. (MonadEval v m, Exception s) => s -> m a
evalError @v (ErrorCall -> m VarName) -> ErrorCall -> m VarName
forall a b. (a -> b) -> a -> b
$ String -> ErrorCall
ErrorCall String
"value is null while a string was expected")
    VarName -> m VarName
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    (Maybe VarName -> m VarName)
-> (NKeyName (m v) -> m (Maybe VarName))
-> NKeyName (m v)
-> m VarName
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< NKeyName (m v) -> m (Maybe VarName)
forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m (Maybe VarName)
evalSetterKeyName

-- | Evaluate a component of an attribute path in a context where we are
-- *binding* a value
evalSetterKeyName
  :: (MonadEval v m, FromValue NixString m v)
  => NKeyName (m v)
  -> m (Maybe Text)
evalSetterKeyName :: NKeyName (m v) -> m (Maybe VarName)
evalSetterKeyName =
  \case
    StaticKey VarName
k -> Maybe VarName -> m (Maybe VarName)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe VarName -> m (Maybe VarName))
-> Maybe VarName -> m (Maybe VarName)
forall a b. (a -> b) -> a -> b
$ VarName -> Maybe VarName
forall (f :: * -> *) a. Applicative f => a -> f a
pure VarName
k
    DynamicKey Antiquoted (NString (m v)) (m v)
k ->
      Maybe VarName
-> (NixString -> Maybe VarName) -> Maybe NixString -> Maybe VarName
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
        Maybe VarName
forall a. Monoid a => a
mempty
        (VarName -> Maybe VarName
forall (f :: * -> *) a. Applicative f => a -> f a
pure (VarName -> Maybe VarName)
-> (NixString -> VarName) -> NixString -> Maybe VarName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NixString -> VarName
stringIgnoreContext)
        (Maybe NixString -> Maybe VarName)
-> m (Maybe NixString) -> m (Maybe VarName)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NString (m v)
-> (NString (m v) -> m (Maybe NixString))
-> (m v -> m (Maybe NixString))
-> Antiquoted (NString (m v)) (m v)
-> m (Maybe NixString)
forall v a r. v -> (v -> a) -> (r -> a) -> Antiquoted v r -> a
runAntiquoted NString (m v)
"\n" NString (m v) -> m (Maybe NixString)
forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NString (m v) -> m (Maybe NixString)
assembleString (v -> m (Maybe NixString)
forall a (m :: * -> *) v. FromValue a m v => v -> m (Maybe a)
fromValueMay (v -> m (Maybe NixString)) -> m v -> m (Maybe NixString)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) Antiquoted (NString (m v)) (m v)
k

assembleString
  :: forall v m
   . (MonadEval v m, FromValue NixString m v)
  => NString (m v)
  -> m (Maybe NixString)
assembleString :: NString (m v) -> m (Maybe NixString)
assembleString =
  [Antiquoted VarName (m v)] -> m (Maybe NixString)
fromParts ([Antiquoted VarName (m v)] -> m (Maybe NixString))
-> (NString (m v) -> [Antiquoted VarName (m v)])
-> NString (m v)
-> m (Maybe NixString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    \case
      Indented   Int
_ [Antiquoted VarName (m v)]
parts -> [Antiquoted VarName (m v)]
parts
      DoubleQuoted [Antiquoted VarName (m v)]
parts -> [Antiquoted VarName (m v)]
parts
 where
  fromParts :: [Antiquoted VarName (m v)] -> m (Maybe NixString)
fromParts [Antiquoted VarName (m v)]
xs = ([NixString] -> NixString
forall a. Monoid a => [a] -> a
mconcat ([NixString] -> NixString) -> Maybe [NixString] -> Maybe NixString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (Maybe [NixString] -> Maybe NixString)
-> ([Maybe NixString] -> Maybe [NixString])
-> [Maybe NixString]
-> Maybe NixString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Maybe NixString] -> Maybe [NixString]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([Maybe NixString] -> Maybe NixString)
-> m [Maybe NixString] -> m (Maybe NixString)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Antiquoted VarName (m v) -> m (Maybe NixString))
-> [Antiquoted VarName (m v)] -> m [Maybe NixString]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Antiquoted VarName (m v) -> m (Maybe NixString)
go [Antiquoted VarName (m v)]
xs

  go :: Antiquoted VarName (m v) -> m (Maybe NixString)
go =
    VarName
-> (VarName -> m (Maybe NixString))
-> (m v -> m (Maybe NixString))
-> Antiquoted VarName (m v)
-> m (Maybe NixString)
forall v a r. v -> (v -> a) -> (r -> a) -> Antiquoted v r -> a
runAntiquoted
      VarName
"\n"
      (Maybe NixString -> m (Maybe NixString)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe NixString -> m (Maybe NixString))
-> (VarName -> Maybe NixString) -> VarName -> m (Maybe NixString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NixString -> Maybe NixString
forall (f :: * -> *) a. Applicative f => a -> f a
pure (NixString -> Maybe NixString)
-> (VarName -> NixString) -> VarName -> Maybe NixString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VarName -> NixString
makeNixStringWithoutContext)
      (v -> m (Maybe NixString)
forall a (m :: * -> *) v. FromValue a m v => v -> m (Maybe a)
fromValueMay (v -> m (Maybe NixString)) -> m v -> m (Maybe NixString)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<)

buildArgument
  :: forall v m . MonadNixEval v m => Params (m v) -> m v -> m (AttrSet v)
buildArgument :: Params (m v) -> m v -> m (AttrSet v)
buildArgument Params (m v)
params m v
arg =
  do
    Scopes m v
scope <- m (Scopes m v)
forall a (m :: * -> *). Scoped a m => m (Scopes m a)
currentScopes :: m (Scopes m v)
    case Params (m v)
params of
      Param VarName
name -> VarName -> v -> AttrSet v
forall k v. Hashable k => k -> v -> HashMap k v
M.singleton VarName
name (v -> AttrSet v) -> m v -> m (AttrSet v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m v -> m v
forall v (m :: * -> *). MonadValue v m => m v -> m v
defer (Scopes m v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope m v
arg)
      ParamSet ParamSet (m v)
s Bool
isVariadic Maybe VarName
m ->
        do
          (AttrSet v
args, AttrSet SourcePos
_) <- forall a (m :: * -> *) v. FromValue a m v => v -> m a
forall (m :: * -> *) v.
FromValue (AttrSet v, AttrSet SourcePos) m v =>
v -> m (AttrSet v, AttrSet SourcePos)
fromValue @(AttrSet v, AttrSet SourcePos) (v -> m (AttrSet v, AttrSet SourcePos))
-> m v -> m (AttrSet v, AttrSet SourcePos)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m v
arg
          let
            inject :: HashMap VarName (b -> m v) -> HashMap VarName (b -> m v)
inject =
              (HashMap VarName (b -> m v) -> HashMap VarName (b -> m v))
-> (VarName
    -> HashMap VarName (b -> m v) -> HashMap VarName (b -> m v))
-> Maybe VarName
-> HashMap VarName (b -> m v)
-> HashMap VarName (b -> m v)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
                HashMap VarName (b -> m v) -> HashMap VarName (b -> m v)
forall a. a -> a
id
                (\ VarName
n -> VarName
-> (b -> m v)
-> HashMap VarName (b -> m v)
-> HashMap VarName (b -> m v)
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert VarName
n ((b -> m v)
 -> HashMap VarName (b -> m v) -> HashMap VarName (b -> m v))
-> (b -> m v)
-> HashMap VarName (b -> m v)
-> HashMap VarName (b -> m v)
forall a b. (a -> b) -> a -> b
$ m v -> b -> m v
forall a b. a -> b -> a
const (m v -> b -> m v) -> m v -> b -> m v
forall a b. (a -> b) -> a -> b
$ m v -> m v
forall v (m :: * -> *). MonadValue v m => m v -> m v
defer (m v -> m v) -> m v -> m v
forall a b. (a -> b) -> a -> b
$ Scopes m v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope m v
arg)
                Maybe VarName
m
          HashMap VarName (AttrSet v -> m v) -> m (AttrSet v)
forall (m :: * -> *) (t :: * -> *) a.
(MonadFix m, Traversable t) =>
t (t a -> m a) -> m (t a)
loebM
            (HashMap VarName (AttrSet v -> m v)
-> HashMap VarName (AttrSet v -> m v)
forall b. HashMap VarName (b -> m v) -> HashMap VarName (b -> m v)
inject (HashMap VarName (AttrSet v -> m v)
 -> HashMap VarName (AttrSet v -> m v))
-> HashMap VarName (AttrSet v -> m v)
-> HashMap VarName (AttrSet v -> m v)
forall a b. (a -> b) -> a -> b
$
                (Maybe (AttrSet v -> m v) -> Maybe (AttrSet v -> m v))
-> HashMap VarName (Maybe (AttrSet v -> m v))
-> HashMap VarName (AttrSet v -> m v)
forall v1 v2 k. (v1 -> Maybe v2) -> HashMap k v1 -> HashMap k v2
M.mapMaybe
                  Maybe (AttrSet v -> m v) -> Maybe (AttrSet v -> m v)
forall a. a -> a
id
                  ((VarName -> These v (Maybe (m v)) -> Maybe (AttrSet v -> m v))
-> AttrSet v
-> HashMap VarName (Maybe (m v))
-> HashMap VarName (Maybe (AttrSet v -> m v))
forall i (f :: * -> *) a b c.
SemialignWithIndex i f =>
(i -> These a b -> c) -> f a -> f b -> f c
ialignWith
                    (Scopes m v
-> Bool
-> VarName
-> These v (Maybe (m v))
-> Maybe (AttrSet v -> m v)
assemble Scopes m v
scope Bool
isVariadic)
                    AttrSet v
args
                    (HashMap VarName (Maybe (m v))
 -> HashMap VarName (Maybe (AttrSet v -> m v)))
-> HashMap VarName (Maybe (m v))
-> HashMap VarName (Maybe (AttrSet v -> m v))
forall a b. (a -> b) -> a -> b
$ ParamSet (m v) -> HashMap VarName (Maybe (m v))
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
M.fromList ParamSet (m v)
s
                  )
            )
 where
  assemble
    :: Scopes m v
    -> Bool
    -> Text
    -> These v (Maybe (m v))
    -> Maybe (AttrSet v -> m v)
  assemble :: Scopes m v
-> Bool
-> VarName
-> These v (Maybe (m v))
-> Maybe (AttrSet v -> m v)
assemble Scopes m v
scope Bool
isVariadic VarName
k =
    \case
      That Maybe (m v)
Nothing -> (AttrSet v -> m v) -> Maybe (AttrSet v -> m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((AttrSet v -> m v) -> Maybe (AttrSet v -> m v))
-> (AttrSet v -> m v) -> Maybe (AttrSet v -> m v)
forall a b. (a -> b) -> a -> b
$ m v -> AttrSet v -> m v
forall a b. a -> b -> a
const (m v -> AttrSet v -> m v) -> m v -> AttrSet v -> m v
forall a b. (a -> b) -> a -> b
$ forall v (m :: * -> *) s a.
(MonadEval v m, Exception s) =>
s -> m a
forall (m :: * -> *) s a. (MonadEval v m, Exception s) => s -> m a
evalError @v (ErrorCall -> m v) -> ErrorCall -> m v
forall a b. (a -> b) -> a -> b
$ String -> ErrorCall
ErrorCall (String -> ErrorCall) -> String -> ErrorCall
forall a b. (a -> b) -> a -> b
$ String
"Missing value for parameter: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> VarName -> String
forall b a. (Show a, IsString b) => a -> b
show VarName
k
      That (Just m v
f) -> (AttrSet v -> m v) -> Maybe (AttrSet v -> m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((AttrSet v -> m v) -> Maybe (AttrSet v -> m v))
-> (AttrSet v -> m v) -> Maybe (AttrSet v -> m v)
forall a b. (a -> b) -> a -> b
$ \AttrSet v
args -> m v -> m v
forall v (m :: * -> *). MonadValue v m => m v -> m v
defer (m v -> m v) -> m v -> m v
forall a b. (a -> b) -> a -> b
$ Scopes m v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope (m v -> m v) -> m v -> m v
forall a b. (a -> b) -> a -> b
$ AttrSet v -> m v -> m v
forall a (m :: * -> *) r. Scoped a m => AttrSet a -> m r -> m r
pushScope AttrSet v
args m v
f
      This v
_
        | Bool
isVariadic -> Maybe (AttrSet v -> m v)
forall a. Maybe a
Nothing
        | Bool
otherwise  -> (AttrSet v -> m v) -> Maybe (AttrSet v -> m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((AttrSet v -> m v) -> Maybe (AttrSet v -> m v))
-> (AttrSet v -> m v) -> Maybe (AttrSet v -> m v)
forall a b. (a -> b) -> a -> b
$ m v -> AttrSet v -> m v
forall a b. a -> b -> a
const (m v -> AttrSet v -> m v) -> m v -> AttrSet v -> m v
forall a b. (a -> b) -> a -> b
$ forall v (m :: * -> *) s a.
(MonadEval v m, Exception s) =>
s -> m a
forall (m :: * -> *) s a. (MonadEval v m, Exception s) => s -> m a
evalError @v (ErrorCall -> m v) -> ErrorCall -> m v
forall a b. (a -> b) -> a -> b
$ String -> ErrorCall
ErrorCall (String -> ErrorCall) -> String -> ErrorCall
forall a b. (a -> b) -> a -> b
$ String
"Unexpected parameter: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> VarName -> String
forall b a. (Show a, IsString b) => a -> b
show VarName
k
      These v
x Maybe (m v)
_ -> (AttrSet v -> m v) -> Maybe (AttrSet v -> m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((AttrSet v -> m v) -> Maybe (AttrSet v -> m v))
-> (AttrSet v -> m v) -> Maybe (AttrSet v -> m v)
forall a b. (a -> b) -> a -> b
$ m v -> AttrSet v -> m v
forall a b. a -> b -> a
const (m v -> AttrSet v -> m v) -> m v -> AttrSet v -> m v
forall a b. (a -> b) -> a -> b
$ v -> m v
forall (f :: * -> *) a. Applicative f => a -> f a
pure v
x

addSourcePositions
  :: (MonadReader e m, Has e SrcSpan) => Transform NExprLocF (m a)
addSourcePositions :: Transform NExprLocF (m a)
addSourcePositions NExprLoc -> m a
f v :: NExprLoc
v@(AnnE SrcSpan
ann NExprF NExprLoc
_) =
  (e -> e) -> m a -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (Setter e e SrcSpan SrcSpan -> SrcSpan -> e -> e
forall s t a b. Setter s t a b -> b -> s -> t
set forall a b. Has a b => Lens' a b
Setter e e SrcSpan SrcSpan
hasLens SrcSpan
ann) (m a -> m a) -> m a -> m a
forall a b. (a -> b) -> a -> b
$ NExprLoc -> m a
f NExprLoc
v

addStackFrames
  :: forall v e m a
   . (Scoped v m, Framed e m, Typeable v, Typeable m)
  => Transform NExprLocF (m a)
addStackFrames :: Transform NExprLocF (m a)
addStackFrames NExprLoc -> m a
f NExprLoc
v =
  do
    Scopes m v
scopes <- m (Scopes m v)
forall a (m :: * -> *). Scoped a m => m (Scopes m a)
currentScopes :: m (Scopes m v)

    -- sectioning gives GHC optimization
    -- If opimization question would arrive again, check the @(`withFrameInfo` f v) $ EvaluatingExpr scopes v@
    -- for possible @scopes@ implementation @v@ type arguments sharing between runs.
    (EvalFrame m v -> m a -> m a
forall a. EvalFrame m v -> m a -> m a
`withFrameInfo` NExprLoc -> m a
f NExprLoc
v) (EvalFrame m v -> m a) -> EvalFrame m v -> m a
forall a b. (a -> b) -> a -> b
$ (Scopes m v -> NExprLoc -> EvalFrame m v
forall (m :: * -> *) v. Scopes m v -> NExprLoc -> EvalFrame m v
`EvaluatingExpr` NExprLoc
v) Scopes m v
scopes
 where
  withFrameInfo :: EvalFrame m v -> m a -> m a
withFrameInfo = NixLevel -> EvalFrame m v -> m a -> m a
forall s e (m :: * -> *) a.
(Framed e m, Exception s) =>
NixLevel -> s -> m a -> m a
withFrame NixLevel
Info

framedEvalExprLoc
  :: forall e v m
   . (MonadNixEval v m, Framed e m, Has e SrcSpan, Typeable m, Typeable v)
  => NExprLoc
  -> m v
framedEvalExprLoc :: NExprLoc -> m v
framedEvalExprLoc =
  (Compose (Ann SrcSpan) NExprF (m v) -> m v)
-> ((NExprLoc -> m v) -> NExprLoc -> m v) -> NExprLoc -> m v
forall (f :: * -> *) a.
Functor f =>
(f a -> a) -> ((Fix f -> a) -> Fix f -> a) -> Fix f -> a
adi (NExprF (m v) -> m v
forall v (m :: * -> *). MonadNixEval v m => NExprF (m v) -> m v
eval (NExprF (m v) -> m v)
-> (Compose (Ann SrcSpan) NExprF (m v) -> NExprF (m v))
-> Compose (Ann SrcSpan) NExprF (m v)
-> m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ann SrcSpan (NExprF (m v)) -> NExprF (m v)
forall ann a. Ann ann a -> a
annotated (Ann SrcSpan (NExprF (m v)) -> NExprF (m v))
-> (Compose (Ann SrcSpan) NExprF (m v)
    -> Ann SrcSpan (NExprF (m v)))
-> Compose (Ann SrcSpan) NExprF (m v)
-> NExprF (m v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Compose (Ann SrcSpan) NExprF (m v) -> Ann SrcSpan (NExprF (m v))
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose) (((NExprLoc -> m v) -> NExprLoc -> m v) -> NExprLoc -> m v)
-> ((NExprLoc -> m v) -> NExprLoc -> m v) -> NExprLoc -> m v
forall a b. (a -> b) -> a -> b
$ forall v e (m :: * -> *) a.
(Scoped v m, Framed e m, Typeable v, Typeable m) =>
Transform NExprLocF (m a)
forall e (m :: * -> *) a.
(Scoped v m, Framed e m, Typeable v, Typeable m) =>
Transform NExprLocF (m a)
addStackFrames @v ((NExprLoc -> m v) -> NExprLoc -> m v)
-> ((NExprLoc -> m v) -> NExprLoc -> m v)
-> (NExprLoc -> m v)
-> NExprLoc
-> m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NExprLoc -> m v) -> NExprLoc -> m v
forall e (m :: * -> *) a.
(MonadReader e m, Has e SrcSpan) =>
Transform NExprLocF (m a)
addSourcePositions