@@ -1490,6 +1490,107 @@ impl<I: Interner> ProgramClauses<I> {
1490
1490
}
1491
1491
}
1492
1492
1493
+ #[ derive( Clone , PartialEq , Eq , Hash , PartialOrd , Ord , HasInterner ) ]
1494
+ pub struct ParameterKinds < I : Interner > {
1495
+ interned : I :: InternedParameterKinds ,
1496
+ }
1497
+
1498
+ impl < I : Interner > ParameterKinds < I > {
1499
+ pub fn new ( interner : & I ) -> Self {
1500
+ Self :: from ( interner, None :: < ParameterKind < ( ) > > )
1501
+ }
1502
+
1503
+ pub fn interned ( & self ) -> & I :: InternedParameterKinds {
1504
+ & self . interned
1505
+ }
1506
+
1507
+ pub fn from (
1508
+ interner : & I ,
1509
+ parameter_kinds : impl IntoIterator < Item = ParameterKind < ( ) > > ,
1510
+ ) -> Self {
1511
+ ParameterKinds {
1512
+ interned : I :: intern_parameter_kinds ( interner, parameter_kinds. into_iter ( ) ) ,
1513
+ }
1514
+ }
1515
+
1516
+ pub fn from_fallible < E > (
1517
+ interner : & I ,
1518
+ parameter_kinds : impl IntoIterator < Item = Result < ParameterKind < ( ) > , E > > ,
1519
+ ) -> Result < Self , E > {
1520
+ let parameter_kinds = parameter_kinds
1521
+ . into_iter ( )
1522
+ . collect :: < Result < Vec < ParameterKind < ( ) > > , _ > > ( ) ?;
1523
+ Ok ( Self :: from ( interner, parameter_kinds) )
1524
+ }
1525
+
1526
+ pub fn iter ( & self , interner : & I ) -> std:: slice:: Iter < ' _ , ParameterKind < ( ) > > {
1527
+ self . as_slice ( interner) . iter ( )
1528
+ }
1529
+
1530
+ pub fn is_empty ( & self , interner : & I ) -> bool {
1531
+ self . as_slice ( interner) . is_empty ( )
1532
+ }
1533
+
1534
+ pub fn len ( & self , interner : & I ) -> usize {
1535
+ self . as_slice ( interner) . len ( )
1536
+ }
1537
+
1538
+ pub fn as_slice ( & self , interner : & I ) -> & [ ParameterKind < ( ) > ] {
1539
+ interner. parameter_kinds_data ( & self . interned )
1540
+ }
1541
+ }
1542
+
1543
+ #[ derive( Clone , PartialEq , Eq , Hash , PartialOrd , Ord , HasInterner ) ]
1544
+ pub struct ParameterKindsWithUniverseIndex < I : Interner > {
1545
+ interned : I :: InternedParameterKindsWithUniverseIndex ,
1546
+ }
1547
+
1548
+ impl < I : Interner > ParameterKindsWithUniverseIndex < I > {
1549
+ pub fn new ( interner : & I ) -> Self {
1550
+ Self :: from ( interner, None :: < ParameterKind < UniverseIndex > > )
1551
+ }
1552
+
1553
+ pub fn interned ( & self ) -> & I :: InternedParameterKindsWithUniverseIndex {
1554
+ & self . interned
1555
+ }
1556
+
1557
+ pub fn from (
1558
+ interner : & I ,
1559
+ parameter_kinds : impl IntoIterator < Item = ParameterKind < UniverseIndex > > ,
1560
+ ) -> Self {
1561
+ ParameterKindsWithUniverseIndex {
1562
+ interned : I :: intern_parameter_kinds_with_universe_index ( interner, parameter_kinds. into_iter ( ) ) ,
1563
+ }
1564
+ }
1565
+
1566
+ pub fn from_fallible < E > (
1567
+ interner : & I ,
1568
+ parameter_kinds : impl IntoIterator < Item = Result < ParameterKind < UniverseIndex > , E > > ,
1569
+ ) -> Result < Self , E > {
1570
+ let parameter_kinds = parameter_kinds
1571
+ . into_iter ( )
1572
+ . collect :: < Result < Vec < ParameterKind < UniverseIndex > > , _ > > ( ) ?;
1573
+ Ok ( Self :: from ( interner, parameter_kinds) )
1574
+ }
1575
+
1576
+ pub fn iter ( & self , interner : & I ) -> std:: slice:: Iter < ' _ , ParameterKind < UniverseIndex > > {
1577
+ self . as_slice ( interner) . iter ( )
1578
+ }
1579
+
1580
+ pub fn is_empty ( & self , interner : & I ) -> bool {
1581
+ self . as_slice ( interner) . is_empty ( )
1582
+ }
1583
+
1584
+ pub fn len ( & self , interner : & I ) -> usize {
1585
+ self . as_slice ( interner) . len ( )
1586
+ }
1587
+
1588
+ pub fn as_slice ( & self , interner : & I ) -> & [ ParameterKind < UniverseIndex > ] {
1589
+ interner. parameter_kinds_with_universe_index_data ( & self . interned )
1590
+ }
1591
+ }
1592
+
1593
+
1493
1594
/// Wraps a "canonicalized item". Items are canonicalized as follows:
1494
1595
///
1495
1596
/// All unresolved existential variables are "renumbered" according to their
0 commit comments