Handle "pathed" rec set attrs by desugaring binds to nested rec sets
This commit is contained in:
parent
f4fbbe7903
commit
bf08deed58
|
@ -23,10 +23,12 @@ import Control.Arrow (first)
|
|||
import Control.Monad
|
||||
import Control.Monad.Fix
|
||||
import Control.Monad.IO.Class
|
||||
import Control.Monad.State
|
||||
import Control.Monad.Trans.Reader
|
||||
import Data.Align.Key
|
||||
import Data.Fix
|
||||
import Data.Functor.Compose
|
||||
import Data.HashMap.Lazy (HashMap)
|
||||
import qualified Data.HashMap.Lazy as M
|
||||
import Data.List (intercalate, partition, foldl')
|
||||
import Data.Maybe (fromMaybe, catMaybes)
|
||||
|
@ -127,7 +129,7 @@ eval (NSet binds) = do
|
|||
|
||||
eval (NRecSet binds) = do
|
||||
traceM "NRecSet..1"
|
||||
(s, p) <- evalBinds True True binds
|
||||
(s, p) <- evalBinds True True (desugarBinds (eval . NRecSet) binds)
|
||||
traceM $ "NRecSet..2: s = " ++ show (void s)
|
||||
traceM $ "NRecSet..2: p = " ++ show (void p)
|
||||
toValue (s, p)
|
||||
|
@ -192,6 +194,29 @@ attrSetAlter (p:ps) m val = case M.lookup p m of
|
|||
recurse s = attrSetAlter ps s val <&> \m' ->
|
||||
M.insert p (toValue =<< fmap (value @_ @_ @m) <$> sequence m') m
|
||||
|
||||
desugarBinds :: forall r. ([Binding r] -> r) -> [Binding r] -> [Binding r]
|
||||
desugarBinds embed binds = evalState (mapM (go <=< collect) binds) M.empty
|
||||
where
|
||||
collect :: Binding r
|
||||
-> State (HashMap VarName (Maybe SourcePos, [Binding r]))
|
||||
(Either VarName (Binding r))
|
||||
collect (NamedVar (StaticKey x p:y:ys) val) = do
|
||||
m <- get
|
||||
let v = case M.lookup x m of
|
||||
Nothing -> (p, [NamedVar (y:ys) val])
|
||||
Just (p, v) -> (p, NamedVar (y:ys) val : v)
|
||||
put $ M.insert x v m
|
||||
pure $ Left x
|
||||
collect x = pure $ Right x
|
||||
|
||||
go :: Either VarName (Binding r)
|
||||
-> State (HashMap VarName (Maybe SourcePos, [Binding r]))
|
||||
(Binding r)
|
||||
go (Right x) = pure x
|
||||
go (Left x) = do
|
||||
Just (p, v) <- gets $ M.lookup x
|
||||
pure $ NamedVar [StaticKey x p] (embed v)
|
||||
|
||||
evalBinds :: forall e v t m. MonadNixEval e v t m
|
||||
=> Bool
|
||||
-> Bool
|
||||
|
|
Loading…
Reference in a new issue