1 from typing
import (TYPE_CHECKING
, AbstractSet
, Iterable
, Iterator
, Mapping
,
2 MutableSet
, TypeVar
, Union
)
5 from typing_extensions
import Literal
, final
11 def __getitem__(self
, v
):
12 if isinstance(v
, tuple):
13 return Union
[tuple(type(i
) for i
in v
)]
18 _T_co
= TypeVar("_T_co", covariant
=True)
21 __all__
= ["final", "Literal", "OFSet", "OSet", "FMap"]
24 class OFSet(AbstractSet
[_T_co
]):
25 """ ordered frozen set """
26 __slots__
= "__items",
28 def __init__(self
, items
=()):
29 # type: (Iterable[_T_co]) -> None
30 self
.__items
= {v
: None for v
in items
}
32 def __contains__(self
, x
):
33 return x
in self
.__items
36 return iter(self
.__items
)
39 return len(self
.__items
)
47 return f
"OFSet({list(self)})"
50 class OSet(MutableSet
[_T
]):
51 """ ordered mutable set """
52 __slots__
= "__items",
54 def __init__(self
, items
=()):
55 # type: (Iterable[_T]) -> None
56 self
.__items
= {v
: None for v
in items
}
58 def __contains__(self
, x
):
59 return x
in self
.__items
62 return iter(self
.__items
)
65 return len(self
.__items
)
69 self
.__items
[value
] = None
71 def discard(self
, value
):
73 self
.__items
.pop(value
, None)
78 return f
"OSet({list(self)})"
81 class FMap(Mapping
[_T
, _T_co
]):
82 """ordered frozen hashable mapping"""
83 __slots__
= "__items", "__hash"
85 def __init__(self
, items
=()):
86 # type: (Mapping[_T, _T_co] | Iterable[tuple[_T, _T_co]]) -> None
87 self
.__items
= dict(items
) # type: dict[_T, _T_co]
88 self
.__hash
= None # type: None | int
90 def __getitem__(self
, item
):
92 return self
.__items
[item
]
95 # type: () -> Iterator[_T]
96 return iter(self
.__items
)
99 return len(self
.__items
)
101 def __eq__(self
, other
):
102 # type: (object) -> bool
103 if isinstance(other
, FMap
):
104 return self
.__items
== other
.__items
105 return super().__eq
__(other
)
108 if self
.__hash
is None:
109 self
.__hash
= hash(frozenset(self
.items()))
113 return f
"FMap({self.__items})"