@@ -1536,11 +1536,62 @@ impl<'module, 'a> Generator<'module, 'a> {
1536
1536
return docvec ! [ left_doc, operator, right_doc] ;
1537
1537
}
1538
1538
1539
+ // Optimise comparison with singleton custom types on JavaScript (https://gleam-lang/gleam/issues/4903)
1540
+ if let (
1541
+ _,
1542
+ // RHS: singleton record constructor (arity 0)
1543
+ TypedExpr :: Var {
1544
+ constructor :
1545
+ ValueConstructor {
1546
+ variant : ValueConstructorVariant :: Record { arity : 0 , name, .. } ,
1547
+ ..
1548
+ } ,
1549
+ ..
1550
+ } ,
1551
+ ) = ( left, right)
1552
+ {
1553
+ let left_doc = self
1554
+ . not_in_tail_position ( Some ( Ordering :: Strict ) , |this| this. wrap_expression ( left) ) ;
1555
+
1556
+ let constructor_name = name. to_doc ( ) ;
1557
+
1558
+ if should_be_equal {
1559
+ return docvec ! [ left_doc, " instanceof " , constructor_name] ;
1560
+ } else {
1561
+ return docvec ! [ "!(" , left_doc, " instanceof " , constructor_name, ")" ] ;
1562
+ }
1563
+ }
1564
+
1565
+ if let (
1566
+ // LHS: singleton record constructor (arity 0)
1567
+ TypedExpr :: Var {
1568
+ constructor :
1569
+ ValueConstructor {
1570
+ variant : ValueConstructorVariant :: Record { arity : 0 , name, .. } ,
1571
+ ..
1572
+ } ,
1573
+ ..
1574
+ } ,
1575
+ _,
1576
+ ) = ( left, right)
1577
+ {
1578
+ let right_doc = self
1579
+ . not_in_tail_position ( Some ( Ordering :: Strict ) , |this| this. wrap_expression ( right) ) ;
1580
+ let constructor_name = name. to_doc ( ) ;
1581
+
1582
+ if should_be_equal {
1583
+ return docvec ! [ right_doc, " instanceof " , constructor_name] ;
1584
+ } else {
1585
+ return docvec ! [ "!(" , right_doc, " instanceof " , constructor_name, ")" ] ;
1586
+ }
1587
+ }
1588
+
1539
1589
// Other types must be compared using structural equality
1540
1590
let left =
1541
1591
self . not_in_tail_position ( Some ( Ordering :: Strict ) , |this| this. wrap_expression ( left) ) ;
1542
1592
let right =
1543
1593
self . not_in_tail_position ( Some ( Ordering :: Strict ) , |this| this. wrap_expression ( right) ) ;
1594
+
1544
1595
self . prelude_equal_call ( should_be_equal, left, right)
1545
1596
}
1546
1597
0 commit comments