@@ -403,6 +403,7 @@ generateBasicsCall mode home name args =
403403 case name of
404404 "composeL" -> decomposeL mode elmLeft [elmRight]
405405 "composeR" -> decomposeR mode [elmLeft] elmRight
406+ "append" -> append mode elmLeft elmRight
406407 "apL" -> generateJsExpr mode $ apply elmLeft elmRight
407408 "apR" -> generateJsExpr mode $ apply elmRight elmLeft
408409 _ ->
@@ -514,6 +515,41 @@ apply func value =
514515 Opt.Call func [value]
515516
516517
518+append :: Mode -> Opt.Expr -> Opt.Expr -> JS.Expr
519+append mode left right =
520+ let seqs = generateJsExpr mode left : toSeqs mode right in
521+ if any isStringLiteral seqs then
522+ foldr1 (JS.Infix JS.OpAdd) seqs
523+ else
524+ foldr1 jsAppend seqs
525+
526+
527+jsAppend :: JS.Expr -> JS.Expr -> JS.Expr
528+jsAppend a b =
529+ JS.Call (JS.Ref (Name.fromKernel N.utils "ap")) [a, b]
530+
531+
532+toSeqs :: Mode -> Opt.Expr -> [JS.Expr]
533+toSeqs mode expr =
534+ case expr of
535+ Opt.Call (Opt.VarGlobal (Opt.Global home "append")) [left, right]
536+ | home == ModuleName.basics ->
537+ generateJsExpr mode left : toSeqs mode right
538+
539+ _ ->
540+ [generateJsExpr mode expr]
541+
542+
543+isStringLiteral :: JS.Expr -> Bool
544+isStringLiteral expr =
545+ case expr of
546+ JS.String _ ->
547+ True
548+
549+ _ ->
550+ False
551+
552+
517553
518554-- SIMPLIFY INFIX OPERATORS
519555