@@ -9,6 +9,7 @@ module Language.PureScript.Sugar.ObjectWildcards (
9import Prelude ()
9import Prelude ()
10import Prelude.Compat
10import Prelude.Compat
12+import Control.Monad (forM)
12import Control.Monad.Error.Class (MonadError(..))
13import Control.Monad.Error.Class (MonadError(..))
13import Control.Monad.Supply.Class
14import Control.Monad.Supply.Class
@@ -45,11 +46,21 @@ desugarObjectConstructors (Module ss coms mn ds exts) = Module ss coms mn <$> ma
45 desugarExpr (Literal (ObjectLiteral ps)) = wrapLambda (Literal . ObjectLiteral) ps
46 desugarExpr (Literal (ObjectLiteral ps)) = wrapLambda (Literal . ObjectLiteral) ps
46 desugarExpr (ObjectUpdate u ps) | isAnonymousArgument u = do
47 desugarExpr (ObjectUpdate u ps) | isAnonymousArgument u = do
47 obj <- freshIdent'
48 obj <- freshIdent'
48− Abs (Left obj) <$> wrapLambda (ObjectUpdate (Var (Qualified Nothing obj))) ps
49+ Abs (Left obj) <$> wrapLambda (ObjectUpdate (argToExpr obj)) ps
49 desugarExpr (ObjectUpdate obj ps) = wrapLambda (ObjectUpdate obj) ps
50 desugarExpr (ObjectUpdate obj ps) = wrapLambda (ObjectUpdate obj) ps
50 desugarExpr (Accessor prop u) | isAnonymousArgument u = do
51 desugarExpr (Accessor prop u) | isAnonymousArgument u = do
51 arg <- freshIdent'
52 arg <- freshIdent'
52− return $ Abs (Left arg) (Accessor prop (Var (Qualified Nothing arg)))
53+ return $ Abs (Left arg) (Accessor prop (argToExpr arg))
54+ desugarExpr (Case args cas) | any isAnonymousArgument args = do
55+ argIdents <- forM args freshIfAnon
56+ let args' = zipWith (\p -> maybe p argToExpr) args argIdents
57+ return $ foldr (Abs . Left) (Case args' cas) (catMaybes argIdents)
58+ desugarExpr (IfThenElse u t f) | any isAnonymousArgument [u, t, f] = do
62+ let if_ = IfThenElse (maybe u argToExpr u') (maybe t argToExpr t') (maybe f argToExpr f')
63+ return $ foldr (Abs . Left) if_ (catMaybes [u', t', f'])
53 desugarExpr e = return e
64 desugarExpr e = return e
55 wrapLambda :: ([(String, Expr)] -> Expr) -> [(String, Expr)] -> m Expr
66 wrapLambda :: ([(String, Expr)] -> Expr) -> [(String, Expr)] -> m Expr
@@ -71,8 +82,14 @@ desugarObjectConstructors (Module ss coms mn ds exts) = Module ss coms mn <$> ma
71 isAnonymousArgument _ = False
82 isAnonymousArgument _ = False
73 mkProp :: (String, Expr) -> m (Maybe Ident, (String, Expr))
84 mkProp :: (String, Expr) -> m (Maybe Ident, (String, Expr))
74− mkProp (name, e)
85+ mkProp (name, e) = do
75− | isAnonymousArgument e = do
86+ arg <- freshIfAnon e
87+ return (arg, (name, maybe e argToExpr arg))
89+ freshIfAnon :: Expr -> m (Maybe Ident)
76− arg <- freshIdent'
91+ | isAnonymousArgument u = Just <$> freshIdent'
92+ | otherwise = return Nothing
94+ argToExpr :: Ident -> Expr
77− return (Just arg, (name, Var (Qualified Nothing arg)))
95+ argToExpr = Var . Qualified Nothing
78− | otherwise = return (Nothing, (name, e))