git.iko.soy/rowtype-yoga/purescript-backend-optimizer
on main help sign in
Use object spread for union (#25)
commit50aa983b916669065e9f2dc2d4ec1abe1ebd9a75 authorNathan Faubion <natefaubion@users.noreply.github.com> dateWed 17 Aug 2022, 16:05 (4 years ago) parent8489969
5 files changed+16−39
backend-es/runtime.js−17 backend-es/src/PureScript/Backend/Optimizer/Codegen/EcmaScript.purs+2−2 backend-es/src/PureScript/Backend/Optimizer/Codegen/EcmaScript/Common.purs+5−2 backend-es/src/PureScript/Backend/Optimizer/Codegen/EcmaScript/Inline.purs+5−11 backend-es/test/snapshots-out/Snapshot.ConvertableOptions01.js+4−7
backend-es/runtime.js−17
@@ -19,20 +19,3 @@ export function binding(init) {
1919export function fail() {
2020 throw new Error("Failed pattern match");
2121}
22−
23−export function recordUnionMutateLeft(lhs, rhs) {
24− for (const [key, value] of Object.entries(rhs)) {
25− if (Reflect.has(lhs, key)) {
26− continue;
27− }
28− lhs[key] = value;
29− }
30− return lhs;
31−}
32−
33−export function recordUnionMutateRight(lhs, rhs) {
34− for (const [key, value] of Object.entries(lhs)) {
35− rhs[key] = value;
36− }
37− return rhs;
38−}
backend-es/src/PureScript/Backend/Optimizer/Codegen/EcmaScript.purs+2−2
@@ -25,7 +25,7 @@ import Dodo as Dodo
2525import Dodo.Common as Dodo.Common
2626import Partial.Unsafe (unsafeCrashWith)
2727import PureScript.Backend.Optimizer.Analysis (Usage(..))
28−import PureScript.Backend.Optimizer.Codegen.EcmaScript.Common (EsStatement(..), esAccessor, esApp, esArray, esAssign, esAssignRef, esBinding, esBindings, esBlock, esBlockStatements, esBoolean, esBranches, esChar, esComment, esContinue, esCurriedFn, esEffectBlock, esError, esEscapeSpecial, esExportAllFrom, esExports, esFn, esIdent, esImport, esImports, esIndex, esInt, esLetBindings, esModuleName, esNumber, esOffset, esProp, esPure, esRecord, esReturn, esSepStatements, esString, esUndefined, esUpdate)
28+import PureScript.Backend.Optimizer.Codegen.EcmaScript.Common (EsStatement(..), esAccessor, esApp, esArray, esAssign, esAssignRef, esBinding, esBindings, esBlock, esBlockStatements, esBoolean, esBranches, esChar, esComment, esContinue, esCurriedFn, esEffectBlock, esError, esEscapeSpecial, esExportAllFrom, esExports, esFn, esIdent, esImport, esImports, esIndex, esInt, esLetBindings, esModuleName, esNumber, esOffset, esProp, esPure, esRecord, esReturn, esSepStatements, esString, esUndefined, esUpdateLeft)
2929import PureScript.Backend.Optimizer.Codegen.EcmaScript.Inline (esInlineMap)
3030import PureScript.Backend.Optimizer.Codegen.Tco (LocalRef, TcoAnalysis(..), TcoExpr(..), TcoPop, TcoRef(..), TcoRole, TcoScope, TcoScopeItem)
3131import PureScript.Backend.Optimizer.Codegen.Tco as Tco
@@ -282,7 +282,7 @@ esCodegenExpr env tcoExpr@(TcoExpr _ expr) = case expr of
282282 Accessor a prop ->
283283 esCodegenAccessor (esCodegenExpr env a) prop
284284 Update a props ->
285− esUpdate (esCodegenExpr env a) (map (esCodegenExpr env) <$> props)
285+ esUpdateLeft (esCodegenExpr env a) (map (esCodegenExpr env) <$> props)
286286 CtorDef ct ty tag [] -> do
287287 let ctorMeta = lookupCtorMeta env (Qualified (Just env.currentModule) tag)
288288 esPureEnv env $ esCtor env.options ct (Qualified Nothing (esCtorIdent ty)) tag ctorMeta []
backend-es/src/PureScript/Backend/Optimizer/Codegen/EcmaScript/Common.purs+5−2
@@ -246,8 +246,11 @@ esIndex expr ix = expr <> Dodo.text "[" <> Dodo.text (show ix) <> Dodo.text "]"
246246esOffset :: forall a. Dodo.Doc a -> Int -> Dodo.Doc a
247247esOffset expr ix = expr <> Dodo.text "._" <> Dodo.text (show (ix + 1))
248248
249−esUpdate :: forall a. Dodo.Doc a -> Array (Prop (Dodo.Doc a)) -> Dodo.Doc a
250−esUpdate rec props = Dodo.Common.jsCurlies $ Dodo.foldWithSeparator Dodo.Common.trailingComma $ Array.cons (Dodo.text "..." <> rec) (esProp <$> props)
249+esUpdateLeft :: forall a. Dodo.Doc a -> Array (Prop (Dodo.Doc a)) -> Dodo.Doc a
250+esUpdateLeft rec props = Dodo.Common.jsCurlies $ Dodo.foldWithSeparator Dodo.Common.trailingComma $ Array.cons (Dodo.text "..." <> rec) (esProp <$> props)
251+
252+esUpdateRight :: forall a. Array (Prop (Dodo.Doc a)) -> Dodo.Doc a -> Dodo.Doc a
253+esUpdateRight props rec = Dodo.Common.jsCurlies $ Dodo.foldWithSeparator Dodo.Common.trailingComma $ Array.snoc (esProp <$> props) (Dodo.text "..." <> rec)
251254
252255esBlock :: forall a. Array (EsStatement (Dodo.Doc a)) -> Dodo.Doc a
253256esBlock stmts = Dodo.text "(" <> esFn mempty stmts <> Dodo.text ")" <> Dodo.text "()"
backend-es/src/PureScript/Backend/Optimizer/Codegen/EcmaScript/Inline.purs+5−11
@@ -7,7 +7,7 @@ import Data.Map as Map
77import Data.Maybe (Maybe(..))
88import Data.Tuple (Tuple(..))
99import Dodo as Dodo
10−import PureScript.Backend.Optimizer.Codegen.EcmaScript.Common (esApp)
10+import PureScript.Backend.Optimizer.Codegen.EcmaScript.Common (esUpdateLeft, esUpdateRight)
1111import PureScript.Backend.Optimizer.Codegen.Tco (TcoExpr(..))
1212import PureScript.Backend.Optimizer.CoreFn (Ident, Literal(..), Qualified)
1313import PureScript.Backend.Optimizer.Semantics.Foreign (qualified)
@@ -26,15 +26,9 @@ record_unsafe_union_unsafeUnionFn :: forall a. EsInline a
2626record_unsafe_union_unsafeUnionFn = Tuple (qualified "Record.Unsafe.Union" "unsafeUnionFn") go
2727 where
2828 go codegenExpr _ = case _ of
29− [ lhs, rhs@(TcoExpr _ (Lit (LitRecord _))) ] ->
30− Just $ esApp (Dodo.text "$runtime.recordUnionMutateRight")
31− [ codegenExpr lhs
32− , codegenExpr rhs
33− ]
34− [ lhs@(TcoExpr _ (Lit (LitRecord _))), rhs ] ->
35− Just $ esApp (Dodo.text "$runtime.recordUnionMutateLeft")
36− [ codegenExpr lhs
37− , codegenExpr rhs
38− ]
29+ [ lhs, TcoExpr _ (Lit (LitRecord props)) ] ->
30+ Just $ esUpdateRight (map codegenExpr <$> props) (codegenExpr lhs)
31+ [ TcoExpr _ (Lit (LitRecord props)), rhs ] ->
32+ Just $ esUpdateLeft (codegenExpr rhs) (map codegenExpr <$> props)
3933 _ ->
4034 Nothing
backend-es/test/snapshots-out/Snapshot.ConvertableOptions01.js+4−7
@@ -6,12 +6,9 @@ import * as Data$dMaybe from "../Data.Maybe/index.js";
66import * as Record$dUnsafe$dUnion from "../Record.Unsafe.Union/index.js";
77import {flubImpl} from "./foreign.js";
88const defaultOptions = {foo: 42, baz: Data$dMaybe.Nothing};
9−const test1 = /* #__PURE__ */ flubImpl(/* #__PURE__ */ $runtime.recordUnionMutateLeft({bar: "Hello"}, defaultOptions));
10−const test2 = /* #__PURE__ */ flubImpl(/* #__PURE__ */ $runtime.recordUnionMutateLeft({foo: 99, bar: "Hello"}, defaultOptions));
11−const test3 = /* #__PURE__ */ flubImpl(/* #__PURE__ */ $runtime.recordUnionMutateLeft(
12− {foo: 99, baz: /* #__PURE__ */ Data$dMaybe.$Maybe("Just", true), bar: "Hello"},
13− defaultOptions
14−));
15−const test4 = /* #__PURE__ */ flubImpl(/* #__PURE__ */ $runtime.recordUnionMutateLeft({foo: 99, baz: /* #__PURE__ */ Data$dMaybe.$Maybe("Just", true), bar: "42"}, defaultOptions));
9+const test1 = /* #__PURE__ */ flubImpl(/* #__PURE__ */ {...defaultOptions, bar: "Hello"});
10+const test2 = /* #__PURE__ */ flubImpl(/* #__PURE__ */ {...defaultOptions, foo: 99, bar: "Hello"});
11+const test3 = /* #__PURE__ */ flubImpl(/* #__PURE__ */ {...defaultOptions, foo: 99, baz: /* #__PURE__ */ Data$dMaybe.$Maybe("Just", true), bar: "Hello"});
12+const test4 = /* #__PURE__ */ flubImpl(/* #__PURE__ */ {...defaultOptions, foo: 99, baz: /* #__PURE__ */ Data$dMaybe.$Maybe("Just", true), bar: "42"});
1613export {defaultOptions, test1, test2, test3, test4};
1714export * from "./foreign.js";