@@ -1490,6 +1490,107 @@ impl<I: Interner> ProgramClauses<I> {
14901490 }
14911491}
14921492
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+
14931594/// Wraps a "canonicalized item". Items are canonicalized as follows:
14941595///
14951596/// All unresolved existential variables are "renumbered" according to their
0 commit comments