ef8c36c3533aaf66cca867a36b0913ae92281bb1
1 from typing
import (TYPE_CHECKING
, AbstractSet
, Any
, Iterable
, Iterator
,
2 Mapping
, MutableSet
, NoReturn
, TypeVar
, Union
)
5 from typing_extensions
import Literal
, Self
, final
11 def __getitem__(self
, v
):
12 if isinstance(v
, tuple):
13 return Union
[tuple(type(i
) for i
in v
)]
20 _T_co
= TypeVar("_T_co", covariant
=True)
23 __all__
= ["final", "Literal", "Self", "assert_never", "OFSet", "OSet", "FMap"]
26 # pyright currently doesn't like typing_extensions' definition
27 # -- added to typing in python 3.11
28 def assert_never(arg
):
29 # type: (NoReturn) -> NoReturn
30 raise AssertionError("got to code that's supposed to be unreachable")
33 class OFSet(AbstractSet
[_T_co
]):
34 """ ordered frozen set """
35 __slots__
= "__items",
37 def __init__(self
, items
=()):
38 # type: (Iterable[_T_co]) -> None
39 self
.__items
= {v
: None for v
in items
}
41 def __contains__(self
, x
):
42 return x
in self
.__items
45 return iter(self
.__items
)
48 return len(self
.__items
)
56 return f
"OFSet({list(self)})"
59 class OSet(MutableSet
[_T
]):
60 """ ordered mutable set """
61 __slots__
= "__items",
63 def __init__(self
, items
=()):
64 # type: (Iterable[_T]) -> None
65 self
.__items
= {v
: None for v
in items
}
67 def __contains__(self
, x
):
68 return x
in self
.__items
71 return iter(self
.__items
)
74 return len(self
.__items
)
78 self
.__items
[value
] = None
80 def discard(self
, value
):
82 self
.__items
.pop(value
, None)
87 return f
"OSet({list(self)})"
90 class FMap(Mapping
[_T
, _T_co
]):
91 """ordered frozen hashable mapping"""
92 __slots__
= "__items", "__hash"
94 def __init__(self
, items
=()):
95 # type: (Mapping[_T, _T_co] | Iterable[tuple[_T, _T_co]]) -> None
96 self
.__items
= dict(items
) # type: dict[_T, _T_co]
97 self
.__hash
= None # type: None | int
99 def __getitem__(self
, item
):
100 # type: (_T) -> _T_co
101 return self
.__items
[item
]
104 # type: () -> Iterator[_T]
105 return iter(self
.__items
)
108 return len(self
.__items
)
110 def __eq__(self
, other
):
111 # type: (object) -> bool
112 if isinstance(other
, FMap
):
113 return self
.__items
== other
.__items
114 return super().__eq
__(other
)
117 if self
.__hash
is None:
118 self
.__hash
= hash(frozenset(self
.items()))
122 return f
"FMap({self.__items})"