{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
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
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
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
{ forall (m :: * -> *) v. SynHoleInfo m v -> NExprLoc
_synHoleInfo_expr :: NExprLoc
, forall (m :: * -> *) v. 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)
eval :: forall v m . MonadNixEval v m => NExprF (m v) -> m v
eval :: forall v (m :: * -> *). MonadNixEval v m => NExprF (m v) -> m v
eval (NSym Text
"__curPos") = m v
forall v (m :: * -> *). MonadEval v m => m v
evalCurPos
eval (NSym Text
var ) =
do
Maybe v
mVal <- Text -> m (Maybe v)
forall a (m :: * -> *). Scoped a m => Text -> m (Maybe a)
lookupVar Text
var
m v -> (v -> m v) -> Maybe v -> m v
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(Text -> m v
forall v (m :: * -> *). MonadEval v m => Text -> m v
freeVariable Text
var)
(Text -> v -> m v
forall v (m :: * -> *). MonadEval v m => Text -> v -> m v
evaledSym Text
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
mVal
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
v
f <- m v
fun
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 v
f (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
eval (NBinary NBinaryOp
op m v
larg m v
rarg) =
do
v
lav <- m v
larg
NBinaryOp -> v -> m v -> m v
forall v (m :: * -> *).
MonadEval v m =>
NBinaryOp -> v -> m v -> m v
evalBinary NBinaryOp
op v
lav m v
rarg
eval (NSelect m v
aset NAttrPath (m v)
attr Maybe (m v)
alt ) =
do
let useAltOrReportMissing :: (v, NonEmpty Text) -> m v
useAltOrReportMissing (v
s, NonEmpty Text
ks) = m v -> Maybe (m v) -> m v
forall a. a -> Maybe a -> a
fromMaybe (NonEmpty Text -> Maybe v -> m v
forall v (m :: * -> *).
MonadEval v m =>
NonEmpty Text -> Maybe v -> m v
attrMissing NonEmpty Text
ks (Maybe v -> m v) -> Maybe v -> m v
forall a b. (a -> b) -> a -> b
$ v -> Maybe v
forall (f :: * -> *) a. Applicative f => a -> f a
pure v
s) Maybe (m v)
alt
Either (v, NonEmpty Text) (m v)
eAttr <- m v -> NAttrPath (m v) -> m (Either (v, NonEmpty Text) (m v))
forall v (m :: * -> *).
MonadNixEval v m =>
m v -> NAttrPath (m v) -> m (Either (v, NonEmpty Text) (m v))
evalSelect m v
aset NAttrPath (m v)
attr
((v, NonEmpty Text) -> m v)
-> (m v -> m v) -> Either (v, NonEmpty Text) (m v) -> m v
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (v, NonEmpty Text) -> m v
useAltOrReportMissing m v -> m v
forall a. a -> a
id Either (v, NonEmpty Text) (m v)
eAttr
eval (NHasAttr m v
aset NAttrPath (m v)
attr) =
do
Either (v, NonEmpty Text) (m v)
eAttr <- m v -> NAttrPath (m v) -> m (Either (v, NonEmpty Text) (m v))
forall v (m :: * -> *).
MonadNixEval v m =>
m v -> NAttrPath (m v) -> m (Either (v, NonEmpty Text) (m v))
evalSelect m v
aset NAttrPath (m v)
attr
Bool -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue (Bool -> m v) -> Bool -> m v
forall a b. (a -> b) -> a -> b
$ Either (v, NonEmpty Text) (m v) -> Bool
forall a b. Either a b -> Bool
isRight Either (v, NonEmpty Text) (m v)
eAttr
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]
lst <- (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 (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
. forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes @v Scopes m v
scope) [m v]
l
[v] -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue [v]
lst
eval (NSet NRecordType
NNonRecursive [Binding (m v)]
binds) =
do
(AttrSet v, AttrSet SourcePos)
attrSet <- 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 (AttrSet v, AttrSet SourcePos))
-> [Binding (m v)] -> m (AttrSet v, AttrSet SourcePos)
forall a b. (a -> b) -> a -> b
$ ([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
(AttrSet v, AttrSet SourcePos) -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue (AttrSet v, AttrSet SourcePos)
attrSet
eval (NSet NRecordType
NRecursive [Binding (m v)]
binds) =
do
(AttrSet v, AttrSet SourcePos)
attrSet <- 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 (AttrSet v, AttrSet SourcePos))
-> [Binding (m v)] -> m (AttrSet v, AttrSet SourcePos)
forall a b. (a -> b) -> a -> b
$ ([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
(AttrSet v, AttrSet SourcePos) -> m v
forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue (AttrSet v, AttrSet SourcePos)
attrSet
eval (NLet [Binding (m v)]
binds m v
body ) =
do
(AttrSet v
attrSet, 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
attrSet 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
Scopes m v
scope <- m (Scopes m v)
forall a (m :: * -> *). Scoped a m => m (Scopes m a)
currentScopes :: m (Scopes m v)
let
withScope :: m r -> m r
withScope = Scopes m v -> m r -> m r
forall a (m :: * -> *) r. Scoped a m => Scopes m a -> m r -> m r
withScopes Scopes m v
scope
withScopeInform :: v -> m v
withScopeInform = m v -> m v
forall {r}. m r -> m r
withScope (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
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
(\m v
arg AttrSet (m v) -> m v -> m (a, v)
k ->
m (a, v) -> m (a, v)
forall {r}. m r -> m r
withScope (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
(v -> m v
withScopeInform (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 Text
name) = Text -> m v
forall v (m :: * -> *). MonadEval v m => Text -> m v
synHole Text
name
evalWithAttrSet :: forall v m . MonadNixEval v m => m v -> m v -> m v
evalWithAttrSet :: forall v (m :: * -> *). MonadNixEval v m => m v -> m v -> m v
evalWithAttrSet m v
aset m v
body = 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
deferredAset <- 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 attrSet :: m (AttrSet v)
attrSet = (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
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
deferredAset)
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)
attrSet 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 :: forall v (m :: * -> *).
MonadNixEval v m =>
[Text]
-> 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
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 (Text
k : [Text]
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
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
)
(Text -> AttrSet (m v) -> Maybe (m v)
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Text
k AttrSet (m v)
m)
)
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Text] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Text]
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 (Text -> 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 Text
k m v
val AttrSet (m v)
m, Text -> SourcePos -> AttrSet SourcePos -> AttrSet SourcePos
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert Text
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
_) ->
(Text -> 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
Text
k
(forall a (m :: * -> *) v. ToValue a m v => a -> 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
, Text -> SourcePos -> AttrSet SourcePos -> AttrSet SourcePos
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert Text
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
<$> [Text]
-> SourcePos
-> AttrSet (m v)
-> AttrSet SourcePos
-> m v
-> m (AttrSet (m v), AttrSet SourcePos)
forall v (m :: * -> *).
MonadNixEval v m =>
[Text]
-> SourcePos
-> AttrSet (m v)
-> AttrSet SourcePos
-> m v
-> m (AttrSet (m v), AttrSet SourcePos)
attrSetAlter [Text]
ks SourcePos
pos AttrSet (m v)
st AttrSet SourcePos
sp m v
val
desugarBinds :: forall r . ([Binding r] -> r) -> [Binding r] -> [Binding r]
desugarBinds :: forall r. ([Binding r] -> r) -> [Binding r] -> [Binding r]
desugarBinds [Binding r] -> r
embed [Binding r]
binds = State (HashMap Text (SourcePos, [Binding r])) [Binding r]
-> HashMap Text (SourcePos, [Binding r]) -> [Binding r]
forall s a. State s a -> s -> a
evalState ((Binding r
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r))
-> [Binding r]
-> State (HashMap Text (SourcePos, [Binding r])) [Binding r]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (Either Text (Binding r)
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r)
go (Either Text (Binding r)
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r))
-> (Binding r
-> StateT
(HashMap Text (SourcePos, [Binding r]))
Identity
(Either Text (Binding r)))
-> Binding r
-> StateT
(HashMap Text (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 Text (SourcePos, [Binding r]))
Identity
(Either Text (Binding r))
collect) [Binding r]
binds) HashMap Text (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 Text (SourcePos, [Binding r]))
Identity
(Either Text (Binding r))
collect (NamedVar (StaticKey Text
x :| NKeyName r
y : [NKeyName r]
ys) r
val SourcePos
p) =
do
HashMap Text (SourcePos, [Binding r])
m <- StateT
(HashMap Text (SourcePos, [Binding r]))
Identity
(HashMap Text (SourcePos, [Binding r]))
forall s (m :: * -> *). MonadState s m => m s
get
HashMap Text (SourcePos, [Binding r])
-> StateT (HashMap Text (SourcePos, [Binding r])) Identity ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put (HashMap Text (SourcePos, [Binding r])
-> StateT (HashMap Text (SourcePos, [Binding r])) Identity ())
-> HashMap Text (SourcePos, [Binding r])
-> StateT (HashMap Text (SourcePos, [Binding r])) Identity ()
forall a b. (a -> b) -> a -> b
$
Text
-> (SourcePos, [Binding r])
-> HashMap Text (SourcePos, [Binding r])
-> HashMap Text (SourcePos, [Binding r])
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert
Text
x
((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, [SourcePos -> Binding r
bindValAt SourcePos
p])
(\ (SourcePos
q, [Binding r]
v) -> (SourcePos
q, SourcePos -> Binding r
bindValAt SourcePos
q Binding r -> [Binding r] -> [Binding r]
forall a. a -> [a] -> [a]
: [Binding r]
v))
(Text
-> HashMap Text (SourcePos, [Binding r])
-> Maybe (SourcePos, [Binding r])
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Text
x HashMap Text (SourcePos, [Binding r])
m)
)
HashMap Text (SourcePos, [Binding r])
m
pure $ Text -> Either Text (Binding r)
forall a b. a -> Either a b
Left Text
x
where
bindValAt :: SourcePos -> Binding r
bindValAt SourcePos
pos = 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
pos
collect Binding r
x = Either Text (Binding r)
-> StateT
(HashMap Text (SourcePos, [Binding r]))
Identity
(Either Text (Binding r))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either Text (Binding r)
-> StateT
(HashMap Text (SourcePos, [Binding r]))
Identity
(Either Text (Binding r)))
-> Either Text (Binding r)
-> StateT
(HashMap Text (SourcePos, [Binding r]))
Identity
(Either Text (Binding r))
forall a b. (a -> b) -> a -> b
$ Binding r -> Either Text (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 Text (Binding r)
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r)
go =
(Text
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r))
-> (Binding r
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r))
-> Either Text (Binding r)
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either
(\ Text
x -> do
Maybe (SourcePos, [Binding r])
maybeValue <- (HashMap Text (SourcePos, [Binding r])
-> Maybe (SourcePos, [Binding r]))
-> StateT
(HashMap Text (SourcePos, [Binding r]))
Identity
(Maybe (SourcePos, [Binding r]))
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets ((HashMap Text (SourcePos, [Binding r])
-> Maybe (SourcePos, [Binding r]))
-> StateT
(HashMap Text (SourcePos, [Binding r]))
Identity
(Maybe (SourcePos, [Binding r])))
-> (HashMap Text (SourcePos, [Binding r])
-> Maybe (SourcePos, [Binding r]))
-> StateT
(HashMap Text (SourcePos, [Binding r]))
Identity
(Maybe (SourcePos, [Binding r]))
forall a b. (a -> b) -> a -> b
$ Text
-> HashMap Text (SourcePos, [Binding r])
-> Maybe (SourcePos, [Binding r])
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Text
x
StateT (HashMap Text (SourcePos, [Binding r])) Identity (Binding r)
-> ((SourcePos, [Binding r])
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r))
-> Maybe (SourcePos, [Binding r])
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(Text
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r)
forall a t. (HasCallStack, IsText t) => t -> a
error (Text
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r))
-> Text
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r)
forall a b. (a -> b) -> a -> b
$ Text
"No binding " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Text
forall b a. (Show a, IsString b) => a -> b
show Text
x)
(\ (SourcePos
p, [Binding r]
v) -> Binding r
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Binding r
-> StateT
(HashMap Text (SourcePos, [Binding r])) Identity (Binding r))
-> Binding r
-> StateT
(HashMap Text (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 (Text -> NKeyName r
forall r. Text -> NKeyName r
StaticKey Text
x NKeyName r -> [NKeyName r] -> NonEmpty (NKeyName r)
forall a. a -> [a] -> NonEmpty a
:| [NKeyName r]
forall a. Monoid a => a
mempty) ([Binding r] -> r
embed [Binding r]
v) SourcePos
p)
Maybe (SourcePos, [Binding r])
maybeValue
)
Binding r
-> StateT
(HashMap Text (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 :: forall v (m :: * -> *).
MonadNixEval v m =>
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
-> [([Text], SourcePos, m v)]
-> m (HashMap Text v, AttrSet SourcePos)
buildResult Scopes m v
scope ([([Text], SourcePos, m v)]
-> m (HashMap Text v, AttrSet SourcePos))
-> ([[([Text], SourcePos, m v)]] -> [([Text], SourcePos, m v)])
-> [[([Text], SourcePos, m v)]]
-> m (HashMap Text v, AttrSet SourcePos)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[([Text], SourcePos, m v)]] -> [([Text], SourcePos, m v)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[([Text], SourcePos, m v)]]
-> m (HashMap Text v, AttrSet SourcePos))
-> m [[([Text], SourcePos, m v)]]
-> m (HashMap Text v, AttrSet SourcePos)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Binding (m v) -> m [([Text], SourcePos, m v)])
-> [Binding (m v)] -> m [[([Text], 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 [([Text], 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
-> [([Text], SourcePos, m v)]
-> m (HashMap Text v, AttrSet SourcePos)
buildResult Scopes m v
scope [([Text], SourcePos, m v)]
bindings =
do
(AttrSet (m v)
s, AttrSet SourcePos
p) <- ((AttrSet (m v), AttrSet SourcePos)
-> ([Text], SourcePos, m v)
-> m (AttrSet (m v), AttrSet SourcePos))
-> (AttrSet (m v), AttrSet SourcePos)
-> [([Text], 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)
-> ([Text], 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)
-> ([Text], 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) [([Text], SourcePos, m v)]
bindings
HashMap Text v
res <-
m (HashMap Text v)
-> m (HashMap Text v) -> Bool -> m (HashMap Text v)
forall a. a -> a -> Bool -> a
bool
((m v -> m v) -> AttrSet (m v) -> m (HashMap Text 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 Text (HashMap Text v -> m v) -> m (HashMap Text v)
forall (m :: * -> *) (t :: * -> *) a.
(MonadFix m, Traversable t) =>
t (t a -> m a) -> m (t a)
loebM (HashMap Text (HashMap Text v -> m v) -> m (HashMap Text v))
-> HashMap Text (HashMap Text v -> m v) -> m (HashMap Text v)
forall a b. (a -> b) -> a -> b
$ m v -> HashMap Text v -> m v
forall {a}. Scoped a m => m v -> AttrSet a -> m v
encapsulate (m v -> HashMap Text v -> m v)
-> AttrSet (m v) -> HashMap Text (HashMap Text v -> m v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AttrSet (m v)
s)
Bool
recursive
pure (HashMap Text v
res, AttrSet SourcePos
p)
where
insert :: (AttrSet (m v), AttrSet SourcePos)
-> ([Text], SourcePos, m v) -> m (AttrSet (m v), AttrSet SourcePos)
insert (AttrSet (m v)
m, AttrSet SourcePos
p) ([Text]
path, SourcePos
pos, m v
value) = [Text]
-> SourcePos
-> AttrSet (m v)
-> AttrSet SourcePos
-> m v
-> m (AttrSet (m v), AttrSet SourcePos)
forall v (m :: * -> *).
MonadNixEval v m =>
[Text]
-> SourcePos
-> AttrSet (m v)
-> AttrSet SourcePos
-> m v
-> m (AttrSet (m v), AttrSet SourcePos)
attrSetAlter [Text]
path SourcePos
pos AttrSet (m v)
m AttrSet SourcePos
p m v
value
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
applyBindToAdt :: Scopes m v -> Binding (m v) -> m [([Text], SourcePos, m v)]
applyBindToAdt :: Scopes m v -> Binding (m v) -> m [([Text], SourcePos, m v)]
applyBindToAdt Scopes m v
_ (NamedVar (StaticKey Text
"__overrides" :| []) m v
finalValue SourcePos
pos) =
do
(HashMap Text v
o', AttrSet SourcePos
p') <- v -> m (HashMap Text v, AttrSet SourcePos)
forall a (m :: * -> *) v. FromValue a m v => v -> m a
fromValue (v -> m (HashMap Text v, AttrSet SourcePos))
-> m v -> m (HashMap Text v, AttrSet SourcePos)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m v
finalValue
[([Text], SourcePos, m v)] -> m [([Text], SourcePos, m v)]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([([Text], SourcePos, m v)] -> m [([Text], SourcePos, m v)])
-> [([Text], SourcePos, m v)] -> m [([Text], SourcePos, m v)]
forall a b. (a -> b) -> a -> b
$
(\ (Text
k, v
v) ->
( [Text
k]
, SourcePos -> Maybe SourcePos -> SourcePos
forall a. a -> Maybe a -> a
fromMaybe SourcePos
pos (Maybe SourcePos -> SourcePos) -> Maybe SourcePos -> SourcePos
forall a b. (a -> b) -> a -> b
$ Text -> AttrSet SourcePos -> Maybe SourcePos
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Text
k AttrSet SourcePos
p'
, v -> m v
forall v (m :: * -> *). MonadValue v m => v -> m v
demand v
v
)
) ((Text, v) -> ([Text], SourcePos, m v))
-> [(Text, v)] -> [([Text], SourcePos, m v)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HashMap Text v -> [(Text, v)]
forall k v. HashMap k v -> [(k, v)]
M.toList HashMap Text v
o'
applyBindToAdt Scopes m v
_ (NamedVar NonEmpty (NKeyName (m v))
pathExpr m v
finalValue SourcePos
pos) =
(\case
([], SourcePos
_, m v
_) -> [([Text], SourcePos, m v)]
forall a. Monoid a => a
mempty
([Text], SourcePos, m v)
result -> [([Text], SourcePos, m v)
result]
) (([Text], SourcePos, m v) -> [([Text], SourcePos, m v)])
-> m ([Text], SourcePos, m v) -> m [([Text], SourcePos, m v)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty (NKeyName (m v)) -> m ([Text], 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 ([Text], SourcePos, m v)
processAttrSetKeys (NKeyName (m v)
h :| [NKeyName (m v)]
t) =
m ([Text], SourcePos, m v)
-> (Text -> m ([Text], SourcePos, m v))
-> Maybe Text
-> m ([Text], SourcePos, m v)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(([Text], SourcePos, m v) -> m ([Text], SourcePos, m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ( [Text]
forall a. Monoid a => a
mempty, SourcePos
nullPos, forall a (m :: * -> *) v. ToValue a m v => a -> m v
toValue @(AttrSet v, AttrSet SourcePos) (HashMap Text v
forall a. Monoid a => a
mempty, AttrSet SourcePos
forall a. Monoid a => a
mempty)) )
(\ Text
k ->
m ([Text], SourcePos, m v)
-> ([NKeyName (m v)] -> m ([Text], SourcePos, m v))
-> [NKeyName (m v)]
-> m ([Text], SourcePos, m v)
forall (t :: * -> *) b a. Foldable t => b -> (t a -> b) -> t a -> b
list
(([Text], SourcePos, m v) -> m ([Text], SourcePos, m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ( [Text
k], SourcePos
pos, m v
finalValue ) )
(\ (NKeyName (m v)
x : [NKeyName (m v)]
xs) ->
do
([Text]
restOfPath, SourcePos
_, m v
v) <- NonEmpty (NKeyName (m v)) -> m ([Text], 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)
([Text], SourcePos, m v) -> m ([Text], SourcePos, m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ( Text
k Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: [Text]
restOfPath, SourcePos
pos, m v
v )
)
[NKeyName (m v)]
t
)
(Maybe Text -> m ([Text], SourcePos, m v))
-> m (Maybe Text) -> m ([Text], SourcePos, m v)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< NKeyName (m v) -> m (Maybe Text)
forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m (Maybe Text)
evalSetterKeyName NKeyName (m v)
h
applyBindToAdt Scopes m v
scope (Inherit Maybe (m v)
ms [NKeyName (m v)]
names SourcePos
pos) =
[Maybe ([Text], SourcePos, m v)] -> [([Text], SourcePos, m v)]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe ([Text], SourcePos, m v)] -> [([Text], SourcePos, m v)])
-> m [Maybe ([Text], SourcePos, m v)]
-> m [([Text], SourcePos, m v)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
(NKeyName (m v) -> m (Maybe ([Text], SourcePos, m v)))
-> [NKeyName (m v)] -> m [Maybe ([Text], 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 ([Text], 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 ([Text], SourcePos, m v))
processScope NKeyName (m v)
nkeyname =
(\ Maybe Text
mkey ->
do
Text
key <- Maybe Text
mkey
pure
([Text
key]
, SourcePos
pos
, m v -> (v -> m v) -> Maybe v -> m v
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(NonEmpty Text -> Maybe v -> m v
forall v (m :: * -> *).
MonadEval v m =>
NonEmpty Text -> Maybe v -> m v
attrMissing (Text
key Text -> [Text] -> NonEmpty Text
forall a. a -> [a] -> NonEmpty a
:| [Text]
forall a. Monoid a => a
mempty) 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
$ Text -> m (Maybe v)
forall a (m :: * -> *). Scoped a m => Text -> m (Maybe a)
lookupVar Text
key)
(\ m v
s ->
do
(HashMap Text v
attrset, AttrSet SourcePos
_) <- forall a (m :: * -> *) v. FromValue a m v => v -> m a
fromValue @(AttrSet v, AttrSet SourcePos) (v -> m (HashMap Text v, AttrSet SourcePos))
-> m v -> m (HashMap Text 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
clearScopes @v (m (Maybe v) -> m (Maybe v)) -> m (Maybe v) -> m (Maybe v)
forall a b. (a -> b) -> a -> b
$ HashMap Text v -> m (Maybe v) -> m (Maybe v)
forall a (m :: * -> *) r. Scoped a m => AttrSet a -> m r -> m r
pushScope HashMap Text v
attrset (m (Maybe v) -> m (Maybe v)) -> m (Maybe v) -> m (Maybe v)
forall a b. (a -> b) -> a -> b
$ Text -> m (Maybe v)
forall a (m :: * -> *). Scoped a m => Text -> m (Maybe a)
lookupVar Text
key
)
Maybe (m v)
ms
)
) (Maybe Text -> Maybe ([Text], SourcePos, m v))
-> m (Maybe Text) -> m (Maybe ([Text], SourcePos, m v))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
NKeyName (m v) -> m (Maybe Text)
forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m (Maybe Text)
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 Text
"__overrides" :| []) r
_ SourcePos
_ -> 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 :: forall v (m :: * -> *).
MonadNixEval v m =>
m v -> NAttrPath (m v) -> m (Either (v, NonEmpty Text) (m v))
evalSelect m v
aset NAttrPath (m v)
attr =
do
v
s <- m v
aset
NonEmpty Text
path <- (NKeyName (m v) -> m Text) -> NAttrPath (m v) -> m (NonEmpty Text)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse NKeyName (m v) -> m Text
forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m Text
evalGetterKeyName NAttrPath (m v)
attr
v -> NonEmpty Text -> m (Either (v, NonEmpty Text) (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 Text -> m (Either (v, NonEmpty Text) (m v))
extract v
s NonEmpty Text
path
where
extract :: v -> NonEmpty Text -> m (Either (v, NonEmpty Text) (m v))
extract v
x path :: NonEmpty Text
path@(Text
k :| [Text]
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 Text) (m v)
-> m (Either (v, NonEmpty Text) (m v))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either (v, NonEmpty Text) (m v)
-> m (Either (v, NonEmpty Text) (m v)))
-> Either (v, NonEmpty Text) (m v)
-> m (Either (v, NonEmpty Text) (m v))
forall a b. (a -> b) -> a -> b
$ (v, NonEmpty Text) -> Either (v, NonEmpty Text) (m v)
forall a b. a -> Either a b
Left (v
x, NonEmpty Text
path)
Just (AttrSet v
s :: AttrSet v, AttrSet SourcePos
p :: AttrSet SourcePos)
| Just v
t <- Text -> AttrSet v -> Maybe v
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Text
k AttrSet v
s ->
do
(m v -> m (Either (v, NonEmpty Text) (m v)))
-> ([Text] -> m v -> m (Either (v, NonEmpty Text) (m v)))
-> [Text]
-> m v
-> m (Either (v, NonEmpty Text) (m v))
forall (t :: * -> *) b a. Foldable t => b -> (t a -> b) -> t a -> b
list
(Either (v, NonEmpty Text) (m v)
-> m (Either (v, NonEmpty Text) (m v))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either (v, NonEmpty Text) (m v)
-> m (Either (v, NonEmpty Text) (m v)))
-> (m v -> Either (v, NonEmpty Text) (m v))
-> m v
-> m (Either (v, NonEmpty Text) (m v))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m v -> Either (v, NonEmpty Text) (m v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure)
(\ (Text
y : [Text]
ys) -> ((v -> NonEmpty Text -> m (Either (v, NonEmpty Text) (m v))
`extract` (Text
y Text -> [Text] -> NonEmpty Text
forall a. a -> [a] -> NonEmpty a
:| [Text]
ys)) (v -> m (Either (v, NonEmpty Text) (m v)))
-> m v -> m (Either (v, NonEmpty Text) (m v))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<))
[Text]
ks
(m v -> m (Either (v, NonEmpty Text) (m v)))
-> m v -> m (Either (v, NonEmpty Text) (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 Text) -> Either (v, NonEmpty Text) (m v)
forall a b. a -> Either a b
Left ((v, NonEmpty Text) -> Either (v, NonEmpty Text) (m v))
-> (v -> (v, NonEmpty Text))
-> v
-> Either (v, NonEmpty Text) (m v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (, NonEmpty Text
path) (v -> Either (v, NonEmpty Text) (m v))
-> m v -> m (Either (v, NonEmpty Text) (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)
evalGetterKeyName
:: forall v m
. (MonadEval v m, FromValue NixString m v)
=> NKeyName (m v)
-> m Text
evalGetterKeyName :: forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m Text
evalGetterKeyName =
m Text -> (Text -> m Text) -> Maybe Text -> m Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(forall v (m :: * -> *) s a.
(MonadEval v m, Exception s) =>
s -> m a
evalError @v (ErrorCall -> m Text) -> ErrorCall -> m Text
forall a b. (a -> b) -> a -> b
$ String -> ErrorCall
ErrorCall String
"value is null while a string was expected")
Text -> m Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure
(Maybe Text -> m Text)
-> (NKeyName (m v) -> m (Maybe Text)) -> NKeyName (m v) -> m Text
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< NKeyName (m v) -> m (Maybe Text)
forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m (Maybe Text)
evalSetterKeyName
evalSetterKeyName
:: (MonadEval v m, FromValue NixString m v)
=> NKeyName (m v)
-> m (Maybe Text)
evalSetterKeyName :: forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NKeyName (m v) -> m (Maybe Text)
evalSetterKeyName =
\case
StaticKey Text
k -> Maybe Text -> m (Maybe Text)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Text -> m (Maybe Text)) -> Maybe Text -> m (Maybe Text)
forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
k
DynamicKey Antiquoted (NString (m v)) (m v)
k ->
Maybe Text
-> (NixString -> Maybe Text) -> Maybe NixString -> Maybe Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
Maybe Text
forall a. Monoid a => a
mempty
(Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> Maybe Text)
-> (NixString -> Text) -> NixString -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NixString -> Text
stringIgnoreContext)
(Maybe NixString -> Maybe Text)
-> m (Maybe NixString) -> m (Maybe Text)
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 :: forall v (m :: * -> *).
(MonadEval v m, FromValue NixString m v) =>
NString (m v) -> m (Maybe NixString)
assembleString =
[Antiquoted Text (m v)] -> m (Maybe NixString)
fromParts ([Antiquoted Text (m v)] -> m (Maybe NixString))
-> (NString (m v) -> [Antiquoted Text (m v)])
-> NString (m v)
-> m (Maybe NixString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
\case
Indented Int
_ [Antiquoted Text (m v)]
parts -> [Antiquoted Text (m v)]
parts
DoubleQuoted [Antiquoted Text (m v)]
parts -> [Antiquoted Text (m v)]
parts
where
fromParts :: [Antiquoted Text (m v)] -> m (Maybe NixString)
fromParts [Antiquoted Text (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 Text (m v) -> m (Maybe NixString))
-> [Antiquoted Text (m v)] -> m [Maybe NixString]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Antiquoted Text (m v) -> m (Maybe NixString)
go [Antiquoted Text (m v)]
xs
go :: Antiquoted Text (m v) -> m (Maybe NixString)
go =
Text
-> (Text -> m (Maybe NixString))
-> (m v -> m (Maybe NixString))
-> Antiquoted Text (m v)
-> m (Maybe NixString)
forall v a r. v -> (v -> a) -> (r -> a) -> Antiquoted v r -> a
runAntiquoted
Text
"\n"
(Maybe NixString -> m (Maybe NixString)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe NixString -> m (Maybe NixString))
-> (Text -> Maybe NixString) -> Text -> 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)
-> (Text -> NixString) -> Text -> Maybe NixString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> 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 :: forall v (m :: * -> *).
MonadNixEval v m =>
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)
let argThunk :: m v
argThunk = 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
case Params (m v)
params of
Param Text
name -> Text -> v -> AttrSet v
forall k v. Hashable k => k -> v -> HashMap k v
M.singleton Text
name (v -> AttrSet v) -> m v -> m (AttrSet v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m v
argThunk
ParamSet ParamSet (m v)
s Bool
isVariadic Maybe Text
m ->
do
(AttrSet v
args, AttrSet SourcePos
_) <- forall a (m :: * -> *) v. FromValue a m v => v -> m a
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 Text (b -> m v) -> HashMap Text (b -> m v)
inject =
(HashMap Text (b -> m v) -> HashMap Text (b -> m v))
-> (Text -> HashMap Text (b -> m v) -> HashMap Text (b -> m v))
-> Maybe Text
-> HashMap Text (b -> m v)
-> HashMap Text (b -> m v)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
HashMap Text (b -> m v) -> HashMap Text (b -> m v)
forall a. a -> a
id
(\ Text
n -> Text
-> (b -> m v) -> HashMap Text (b -> m v) -> HashMap Text (b -> m v)
forall k v.
(Eq k, Hashable k) =>
k -> v -> HashMap k v -> HashMap k v
M.insert Text
n ((b -> m v) -> HashMap Text (b -> m v) -> HashMap Text (b -> m v))
-> (b -> m v) -> HashMap Text (b -> m v) -> HashMap Text (b -> m v)
forall a b. (a -> b) -> a -> b
$ m v -> b -> m v
forall a b. a -> b -> a
const m v
argThunk)
Maybe Text
m
HashMap Text (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 Text (AttrSet v -> m v) -> HashMap Text (AttrSet v -> m v)
forall {b}. HashMap Text (b -> m v) -> HashMap Text (b -> m v)
inject (HashMap Text (AttrSet v -> m v)
-> HashMap Text (AttrSet v -> m v))
-> HashMap Text (AttrSet v -> m v)
-> HashMap Text (AttrSet v -> m v)
forall a b. (a -> b) -> a -> b
$
(Maybe (AttrSet v -> m v) -> Maybe (AttrSet v -> m v))
-> HashMap Text (Maybe (AttrSet v -> m v))
-> HashMap Text (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
((Text -> These v (Maybe (m v)) -> Maybe (AttrSet v -> m v))
-> AttrSet v
-> HashMap Text (Maybe (m v))
-> HashMap Text (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
-> Text
-> These v (Maybe (m v))
-> Maybe (AttrSet v -> m v)
assemble Scopes m v
scope Bool
isVariadic)
AttrSet v
args
(HashMap Text (Maybe (m v))
-> HashMap Text (Maybe (AttrSet v -> m v)))
-> HashMap Text (Maybe (m v))
-> HashMap Text (Maybe (AttrSet v -> m v))
forall a b. (a -> b) -> a -> b
$ ParamSet (m v) -> HashMap Text (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
-> Text
-> These v (Maybe (m v))
-> Maybe (AttrSet v -> m v)
assemble Scopes m v
scope Bool
isVariadic Text
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
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
<> Text -> String
forall b a. (Show a, IsString b) => a -> b
show Text
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
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
<> Text -> String
forall b a. (Show a, IsString b) => a -> b
show Text
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 :: forall e (m :: * -> *) a.
(MonadReader e m, Has e SrcSpan) =>
Transform (Compose (Ann SrcSpan) NExprF) (m a)
addSourcePositions NExprLoc -> m a
f (v :: NExprLoc
v@(AnnE SrcSpan
ann NExprF NExprLoc
_) :: 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)
=> TransformF NExprLoc (m a)
addStackFrames :: forall v e (m :: * -> *) a.
(Scoped v m, Framed e m, Typeable v, Typeable m) =>
TransformF NExprLoc (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)
(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 :: forall e v (m :: * -> *).
(MonadNixEval v m, Framed e m, Has e SrcSpan, Typeable m,
Typeable v) =>
NExprLoc -> m v
framedEvalExprLoc =
Transform (Compose (Ann SrcSpan) NExprF) (m v)
-> Alg (Compose (Ann SrcSpan) NExprF) (m v) -> NExprLoc -> m v
forall (f :: * -> *) a.
Functor f =>
Transform f a -> Alg f a -> Fix f -> a
adi Transform (Compose (Ann SrcSpan) NExprF) (m v)
forall v (m :: * -> *) e a.
(Framed e m, Scoped v m, Has e SrcSpan, Typeable m, Typeable v) =>
TransformF NExprLoc (m a)
addMetaInfo Alg (Compose (Ann SrcSpan) NExprF) (m v)
forall v (m :: * -> *) ann.
MonadNixEval v m =>
AnnF ann NExprF (m v) -> m v
evalContent
addMetaInfo
:: forall v m e a
. (Framed e m, Scoped v m, Has e SrcSpan, Typeable m, Typeable v)
=> TransformF NExprLoc (m a)
addMetaInfo :: forall v (m :: * -> *) e a.
(Framed e m, Scoped v m, Has e SrcSpan, Typeable m, Typeable v) =>
TransformF NExprLoc (m a)
addMetaInfo = forall v e (m :: * -> *) a.
(Scoped v m, Framed e m, Typeable v, Typeable m) =>
TransformF NExprLoc (m a)
addStackFrames @v TransformF NExprLoc (m a)
-> TransformF NExprLoc (m a) -> TransformF NExprLoc (m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TransformF NExprLoc (m a)
forall e (m :: * -> *) a.
(MonadReader e m, Has e SrcSpan) =>
Transform (Compose (Ann SrcSpan) NExprF) (m a)
addSourcePositions
evalContent
:: MonadNixEval v m
=> AnnF ann NExprF (m v)
-> m v
evalContent :: forall v (m :: * -> *) ann.
MonadNixEval v m =>
AnnF ann NExprF (m v) -> m v
evalContent = NExprF (m v) -> m v
forall v (m :: * -> *). MonadNixEval v m => NExprF (m v) -> m v
eval (NExprF (m v) -> m v)
-> (AnnF ann NExprF (m v) -> NExprF (m v))
-> AnnF ann NExprF (m v)
-> m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnnF ann NExprF (m v) -> NExprF (m v)
forall ann (f :: * -> *) r. AnnF ann f r -> f r
stripAnn