@@ -60,29 +60,29 @@ class Sub(Base): ...
class Unrelated : . . .
def unbounded [ T ] ( ) :
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . always ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars ( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . never ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars ( ) )
# (T = Never) is a valid specialization, which satisfies (T ≤ Unrelated).
static_assert ( ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Unrelated ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Base) is a valid specialization, which does not satisfy (T ≤ Unrelated).
static_assert ( not ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars ( ) )
# (T = Base) is a valid specialization, which satisfies (T ≤ Super).
static_assert ( ConstraintSet . range ( Never , T , Super ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Super ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Unrelated) is a valid specialization, which does not satisfy (T ≤ Super).
static_assert ( not ConstraintSet . range ( Never , T , Super ) . satisfied_by_all_typevars ( ) )
# (T = Base) is a valid specialization, which satisfies (T ≤ Base).
static_assert ( ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Base ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Unrelated) is a valid specialization, which does not satisfy (T ≤ Base).
static_assert ( not ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars ( ) )
# (T = Sub) is a valid specialization, which satisfies (T ≤ Sub).
static_assert ( ConstraintSet . range ( Never , T , Sub ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Sub ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Unrelated) is a valid specialization, which does not satisfy (T ≤ Sub).
static_assert ( not ConstraintSet . range ( Never , T , Sub ) . satisfied_by_all_typevars ( ) )
```
@@ -106,38 +106,38 @@ class Sub(Base): ...
class Unrelated : . . .
def bounded [ T : Base ] ( ) :
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . always ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars ( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . never ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars ( ) )
# (T = Base) is a valid specialization, which satisfies (T ≤ Super).
static_assert ( ConstraintSet . range ( Never , T , Super ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Super ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# Every valid specialization satisfies (T ≤ Base). Since (Base ≤ Super), every valid
# specialization also satisfies (T ≤ Super).
static_assert ( ConstraintSet . range ( Never , T , Super ) . satisfied_by_all_typevars ( ) )
# (T = Base) is a valid specialization, which satisfies (T ≤ Base).
static_assert ( ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Base ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# Every valid specialization satisfies (T ≤ Base).
static_assert ( ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars ( ) )
# (T = Sub) is a valid specialization, which satisfies (T ≤ Sub).
static_assert ( ConstraintSet . range ( Never , T , Sub ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Sub ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Base) is a valid specialization, which does not satisfy (T ≤ Sub).
static_assert ( not ConstraintSet . range ( Never , T , Sub ) . satisfied_by_all_typevars ( ) )
# (T = Never) is a valid specialization, which satisfies (T ≤ Unrelated).
constraints = ConstraintSet . range ( Never , T , Unrelated )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Base) is a valid specialization, which does not satisfy (T ≤ Unrelated).
static_assert ( not constraints . satisfied_by_all_typevars ( ) )
# Never is the only type that satisfies both (T ≤ Base) and (T ≤ Unrelated). So there is no
# valid specialization that satisfies (T ≤ Unrelated ∧ T ≠ Never).
constraints = constraints & ~ ConstraintSet . range ( Never , T , Never )
static_assert ( not constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not constraints . satisfied_by_all_typevars ( ) )
```
@@ -153,15 +153,15 @@ the constraint set.
from typing import Any
def bounded_by_gradual [ T : Any ] ( ) :
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . always ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars ( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . never ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars ( ) )
# If we choose Base as the materialization for the upper bound, then (T = Base) is a valid
# specialization, which satisfies (T ≤ Base).
static_assert ( ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Base ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# We are free to choose any materialization of the upper bound, and only have to show that the
# constraint set holds for that one materialization. Having chosen one materialization, we then
# have to show that the constraint set holds for all valid specializations of that
@@ -173,7 +173,7 @@ def bounded_by_gradual[T: Any]():
# If we choose Unrelated as the materialization, then (T = Unrelated) is a valid specialization,
# which satisfies (T ≤ Unrelated).
constraints = ConstraintSet . range ( Never , T , Unrelated )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# If we choose Never as the materialization, then (T = Never) is the only valid specialization,
# which satisfies (T ≤ Unrelated).
static_assert ( constraints . satisfied_by_all_typevars ( ) )
@@ -181,7 +181,7 @@ def bounded_by_gradual[T: Any]():
# If we choose Unrelated as the materialization, then (T = Unrelated) is a valid specialization,
# which satisfies (T ≤ Unrelated ∧ T ≠ Never).
constraints = constraints & ~ ConstraintSet . range ( Never , T , Never )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# There is no upper bound that we can choose to satisfy this constraint set in non-inferable
# position. (T = Never) will be a valid assignment no matter what, and that does not satisfy
# (T ≤ Unrelated ∧ T ≠ Never).
@@ -196,15 +196,15 @@ restrictive variance (i.e., invariance), but we get the same results for other v
``` py
def bounded_by_gradual [ T : list [ Any ] ] ( ) :
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . always ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars ( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . never ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars ( ) )
# If we choose list[Base] as the materialization of the upper bound, then (T = list[Base]) is a
# valid specialization, which satisfies (T ≤ list[Base]).
static_assert ( ConstraintSet . range ( Never , T , list [ Base ] ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , list [ Base ] ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# If we choose Base as the materialization, then all valid specializations must satisfy
# (T ≤ list[Base]).
# We are free to choose any materialization of the upper bound, and only have to show that the
@@ -217,7 +217,7 @@ def bounded_by_gradual[T: list[Any]]():
# If we choose Unrelated as the materialization, then (T = list[Unrelated]) is a valid
# specialization, which satisfies (T ≤ list[Unrelated]).
constraints = ConstraintSet . range ( Never , T , list [ Unrelated ] )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# If we choose Unrelated as the materialization, then all valid specializations must satisfy
# (T ≤ list[Unrelated]).
static_assert ( constraints . satisfied_by_all_typevars ( ) )
@@ -225,7 +225,7 @@ def bounded_by_gradual[T: list[Any]]():
# If we choose Unrelated as the materialization, then (T = list[Unrelated]) is a valid
# specialization, which satisfies (T ≤ list[Unrelated] ∧ T ≠ Never).
constraints = constraints & ~ ConstraintSet . range ( Never , T , Never )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# There is no upper bound that we can choose to satisfy this constraint set in non-inferable
# position. (T = Never) will be a valid assignment no matter what, and that does not satisfy
# (T ≤ list[Unrelated] ∧ T ≠ Never).
@@ -251,61 +251,61 @@ class Sub(Base): ...
class Unrelated : . . .
def constrained [ T : ( Base , Unrelated ) ] ( ) :
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . always ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars ( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . never ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars ( ) )
# (T = Unrelated) is a valid specialization, which satisfies (T ≤ Unrelated).
static_assert ( ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Unrelated ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Base) is a valid specialization, which does not satisfy (T ≤ Unrelated).
static_assert ( not ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars ( ) )
# (T = Base) is a valid specialization, which satisfies (T ≤ Super).
static_assert ( ConstraintSet . range ( Never , T , Super ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Super ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Unrelated) is a valid specialization, which does not satisfy (T ≤ Super).
static_assert ( not ConstraintSet . range ( Never , T , Super ) . satisfied_by_all_typevars ( ) )
# (T = Base) is a valid specialization, which satisfies (T ≤ Base).
static_assert ( ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Base ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Unrelated) is a valid specialization, which does not satisfy (T ≤ Base).
static_assert ( not ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars ( ) )
# Neither (T = Base) nor (T = Unrelated) satisfy (T ≤ Sub).
static_assert ( not ConstraintSet . range ( Never , T , Sub ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . range ( Never , T , Sub ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . range ( Never , T , Sub ) . satisfied_by_all_typevars ( ) )
# (T = Base) and (T = Unrelated) both satisfy (T ≤ Super ∨ T ≤ Unrelated).
constraints = ConstraintSet . range ( Never , T , Super ) | ConstraintSet . range ( Never , T , Unrelated )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( constraints . satisfied_by_all_typevars ( ) )
# (T = Base) and (T = Unrelated) both satisfy (T ≤ Base ∨ T ≤ Unrelated).
constraints = ConstraintSet . range ( Never , T , Base ) | ConstraintSet . range ( Never , T , Unrelated )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( constraints . satisfied_by_all_typevars ( ) )
# (T = Unrelated) is a valid specialization, which satisfies (T ≤ Sub ∨ T ≤ Unrelated).
constraints = ConstraintSet . range ( Never , T , Sub ) | ConstraintSet . range ( Never , T , Unrelated )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Base) is a valid specialization, which does not satisfy (T ≤ Sub ∨ T ≤ Unrelated).
static_assert ( not constraints . satisfied_by_all_typevars ( ) )
# (T = Unrelated) is a valid specialization, which satisfies (T = Super ∨ T = Unrelated).
constraints = ConstraintSet . range ( Super , T , Super ) | ConstraintSet . range ( Unrelated , T , Unrelated )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Base) is a valid specialization, which does not satisfy (T = Super ∨ T = Unrelated).
static_assert ( not constraints . satisfied_by_all_typevars ( ) )
# (T = Base) and (T = Unrelated) both satisfy (T = Base ∨ T = Unrelated).
constraints = ConstraintSet . range ( Base , T , Base ) | ConstraintSet . range ( Unrelated , T , Unrelated )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( constraints . satisfied_by_all_typevars ( ) )
# (T = Unrelated) is a valid specialization, which satisfies (T = Sub ∨ T = Unrelated).
constraints = ConstraintSet . range ( Sub , T , Sub ) | ConstraintSet . range ( Unrelated , T , Unrelated )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# (T = Base) is a valid specialization, which does not satisfy (T = Sub ∨ T = Unrelated).
static_assert ( not constraints . satisfied_by_all_typevars ( ) )
```
@@ -322,50 +322,50 @@ satisfy the constraint set.
from typing import Any
def constrained_by_gradual [ T : ( Base , Any ) ] ( ) :
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . always ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars ( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . never ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars ( ) )
# If we choose Unrelated as the materialization of the gradual constraint, then (T = Unrelated)
# is a valid specialization, which satisfies (T ≤ Unrelated).
static_assert ( ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Unrelated ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# No matter which materialization we choose, (T = Base) is a valid specialization, which does
# not satisfy (T ≤ Unrelated).
static_assert ( not ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars ( ) )
# If we choose Super as the materialization, then (T = Super) is a valid specialization, which
# satisfies (T ≤ Super).
static_assert ( ConstraintSet . range ( Never , T , Super ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Super ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# If we choose Never as the materialization, then (T = Base) and (T = Never) are the only valid
# specializations, both of which satisfy (T ≤ Super).
static_assert ( ConstraintSet . range ( Never , T , Super ) . satisfied_by_all_typevars ( ) )
# If we choose Base as the materialization, then (T = Base) is a valid specialization, which
# satisfies (T ≤ Base).
static_assert ( ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Base ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# If we choose Never as the materialization, then (T = Base) and (T = Never) are the only valid
# specializations, both of which satisfy (T ≤ Base).
static_assert ( ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars ( ) )
def constrained_by_two_gradual [ T : ( Any , Any ) ] ( ) :
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . always ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars ( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . never ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars ( ) )
# If we choose Unrelated as the materialization of either constraint, then (T = Unrelated) is a
# valid specialization, which satisfies (T ≤ Unrelated).
static_assert ( ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Unrelated ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# If we choose Unrelated as the materialization of both constraints, then (T = Unrelated) is the
# only valid specialization, which satisfies (T ≤ Unrelated).
static_assert ( ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars ( ) )
# If we choose Base as the materialization of either constraint, then (T = Base) is a valid
# specialization, which satisfies (T ≤ Base).
static_assert ( ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , Base ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# If we choose Never as the materialization of both constraints, then (T = Never) is the only
# valid specialization, which satisfies (T ≤ Base).
static_assert ( ConstraintSet . range ( Never , T , Base ) . satisfied_by_all_typevars ( ) )
@@ -379,35 +379,35 @@ restrictive variance (i.e., invariance), but we get the same results for other v
``` py
def constrained_by_gradual [ T : ( list [ Base ] , list [ Any ] ) ] ( ) :
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . always ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars ( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . never ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars ( ) )
# No matter which materialization we choose, every valid specialization will be of the form
# (T = list[X]). Because Unrelated is final, it is disjoint from all lists. There is therefore
# no materialization or specialization that satisfies (T ≤ Unrelated).
static_assert ( not ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . range ( Never , T , Unrelated ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars ( ) )
# If we choose list[Super] as the materialization, then (T = list[Super]) is a valid
# specialization, which satisfies (T ≤ list[Super]).
static_assert ( ConstraintSet . range ( Never , T , list [ Super ] ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , list [ Super ] ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# No matter which materialization we choose, (T = list[Base]) is a valid specialization, which
# does not satisfy (T ≤ list[Super]).
static_assert ( not ConstraintSet . range ( Never , T , list [ Super ] ) . satisfied_by_all_typevars ( ) )
# If we choose list[Base] as the materialization, then (T = list[Base]) is a valid
# specialization, which satisfies (T ≤ list[Base]).
static_assert ( ConstraintSet . range ( Never , T , list [ Base ] ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , list [ Base ] ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# If we choose list[Base] as the materialization, then all valid specializations must satisfy
# (T ≤ list[Base]).
static_assert ( ConstraintSet . range ( Never , T , list [ Base ] ) . satisfied_by_all_typevars ( ) )
# If we choose list[Sub] as the materialization, then (T = list[Sub]) is a valid specialization,
# which # satisfies (T ≤ list[Sub]).
static_assert ( ConstraintSet . range ( Never , T , list [ Sub ] ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , list [ Sub ] ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# No matter which materialization we choose, (T = list[Base]) is a valid specialization, which
# does not satisfy (T ≤ list[Sub]).
static_assert ( not ConstraintSet . range ( Never , T , list [ Sub ] ) . satisfied_by_all_typevars ( ) )
@@ -415,7 +415,7 @@ def constrained_by_gradual[T: (list[Base], list[Any])]():
# If we choose list[Unrelated] as the materialization, then (T = list[Unrelated]) is a valid
# specialization, which satisfies (T ≤ list[Unrelated]).
constraints = ConstraintSet . range ( Never , T , list [ Unrelated ] )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# No matter which materialization we choose, (T = list[Base]) is a valid specialization, which
# does not satisfy (T ≤ list[Unrelated]).
static_assert ( not constraints . satisfied_by_all_typevars ( ) )
@@ -423,42 +423,42 @@ def constrained_by_gradual[T: (list[Base], list[Any])]():
# If we choose list[Unrelated] as the materialization, then (T = list[Unrelated]) is a valid
# specialization, which satisfies (T ≤ list[Unrelated] ∧ T ≠ Never).
constraints = constraints & ~ ConstraintSet . range ( Never , T , Never )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# There is no materialization that we can choose to satisfy this constraint set in non-inferable
# position. (T = Never) will be a valid assignment no matter what, and that does not satisfy
# (T ≤ list[Unrelated] ∧ T ≠ Never).
static_assert ( not constraints . satisfied_by_all_typevars ( ) )
def constrained_by_two_gradual [ T : ( list [ Any ] , list [ Any ] ) ] ( ) :
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . always ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( ConstraintSet . always ( ) . satisfied_by_all_typevars ( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . never ( ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . never ( ) . satisfied_by_all_typevars ( ) )
# No matter which materialization we choose, every valid specialization will be of the form
# (T = list[X]). Because Unrelated is final, it is disjoint from all lists. There is therefore
# no materialization or specialization that satisfies (T ≤ Unrelated).
static_assert ( not ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( not ConstraintSet . range ( Never , T , Unrelated ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
static_assert ( not ConstraintSet . range ( Never , T , Unrelated ) . satisfied_by_all_typevars ( ) )
# If we choose list[Super] as the materialization, then (T = list[Super]) is a valid
# specialization, which satisfies (T ≤ list[Super]).
static_assert ( ConstraintSet . range ( Never , T , list [ Super ] ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , list [ Super ] ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# No matter which materialization we choose, (T = list[Base]) is a valid specialization, which
# does not satisfy (T ≤ list[Super]).
static_assert ( ConstraintSet . range ( Never , T , list [ Super ] ) . satisfied_by_all_typevars ( ) )
# If we choose list[Base] as the materialization, then (T = list[Base]) is a valid
# specialization, which satisfies (T ≤ list[Base]).
static_assert ( ConstraintSet . range ( Never , T , list [ Base ] ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , list [ Base ] ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# If we choose Base as the materialization, then all valid specializations must satisfy
# (T ≤ list[Base]).
static_assert ( ConstraintSet . range ( Never , T , list [ Base ] ) . satisfied_by_all_typevars ( ) )
# If we choose list[Sub] as the materialization, then (T = list[Sub]) is a valid specialization,
# which satisfies (T ≤ list[Sub]).
static_assert ( ConstraintSet . range ( Never , T , list [ Sub ] ) . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( ConstraintSet . range ( Never , T , list [ Sub ] ) . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# No matter which materialization we choose, (T = list[Base]) is a valid specialization, which
# does not satisfy (T ≤ list[Sub]).
static_assert ( ConstraintSet . range ( Never , T , list [ Sub ] ) . satisfied_by_all_typevars ( ) )
@@ -466,7 +466,7 @@ def constrained_by_two_gradual[T: (list[Any], list[Any])]():
# If we choose list[Unrelated] as the materialization, then (T = list[Unrelated]) is a valid
# specialization, which satisfies (T ≤ list[Unrelated]).
constraints = ConstraintSet . range ( Never , T , list [ Unrelated ] )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# No matter which materialization we choose, (T = list[Base]) is a valid specialization, which
# does not satisfy (T ≤ list[Unrelated]).
static_assert ( constraints . satisfied_by_all_typevars ( ) )
@@ -474,7 +474,7 @@ def constrained_by_two_gradual[T: (list[Any], list[Any])]():
# If we choose list[Unrelated] as the materialization, then (T = list[Unrelated]) is a valid
# specialization, which satisfies (T ≤ list[Unrelated] ∧ T ≠ Never).
constraints = constraints & ~ ConstraintSet . range ( Never , T , Never )
static_assert ( constraints . satisfied_by_all_typevars (inferable = tuple [ T ] ) )
static_assert ( constraints . with_inferable ( T ) . satisfied_by_all_typevars( ) )
# There is no constraint that we can choose to satisfy this constraint set in non-inferable
# position. (T = Never) will be a valid assignment no matter what, and that does not satisfy
# (T ≤ list[Unrelated] ∧ T ≠ Never).