coinex-api 0.0.14__py3-none-any.whl → 0.0.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. {coinex_api-0.0.14.dist-info → coinex_api-0.0.15.dist-info}/METADATA +1 -1
  2. coinex_api-0.0.15.dist-info/RECORD +3 -0
  3. coinex/__init__.py +0 -7
  4. coinex/ccxt/__init__.py +0 -101
  5. coinex/ccxt/abstract/coinex.py +0 -237
  6. coinex/ccxt/async_support/__init__.py +0 -80
  7. coinex/ccxt/async_support/base/__init__.py +0 -1
  8. coinex/ccxt/async_support/base/exchange.py +0 -2100
  9. coinex/ccxt/async_support/base/throttler.py +0 -50
  10. coinex/ccxt/async_support/base/ws/__init__.py +0 -38
  11. coinex/ccxt/async_support/base/ws/aiohttp_client.py +0 -147
  12. coinex/ccxt/async_support/base/ws/cache.py +0 -213
  13. coinex/ccxt/async_support/base/ws/client.py +0 -214
  14. coinex/ccxt/async_support/base/ws/fast_client.py +0 -97
  15. coinex/ccxt/async_support/base/ws/functions.py +0 -59
  16. coinex/ccxt/async_support/base/ws/future.py +0 -69
  17. coinex/ccxt/async_support/base/ws/order_book.py +0 -78
  18. coinex/ccxt/async_support/base/ws/order_book_side.py +0 -174
  19. coinex/ccxt/async_support/coinex.py +0 -5833
  20. coinex/ccxt/base/__init__.py +0 -27
  21. coinex/ccxt/base/decimal_to_precision.py +0 -174
  22. coinex/ccxt/base/errors.py +0 -267
  23. coinex/ccxt/base/exchange.py +0 -6769
  24. coinex/ccxt/base/precise.py +0 -297
  25. coinex/ccxt/base/types.py +0 -577
  26. coinex/ccxt/coinex.py +0 -5832
  27. coinex/ccxt/pro/__init__.py +0 -21
  28. coinex/ccxt/pro/coinex.py +0 -1366
  29. coinex/ccxt/static_dependencies/README.md +0 -1
  30. coinex/ccxt/static_dependencies/__init__.py +0 -1
  31. coinex/ccxt/static_dependencies/ecdsa/__init__.py +0 -14
  32. coinex/ccxt/static_dependencies/ecdsa/_version.py +0 -520
  33. coinex/ccxt/static_dependencies/ecdsa/curves.py +0 -56
  34. coinex/ccxt/static_dependencies/ecdsa/der.py +0 -221
  35. coinex/ccxt/static_dependencies/ecdsa/ecdsa.py +0 -310
  36. coinex/ccxt/static_dependencies/ecdsa/ellipticcurve.py +0 -197
  37. coinex/ccxt/static_dependencies/ecdsa/keys.py +0 -332
  38. coinex/ccxt/static_dependencies/ecdsa/numbertheory.py +0 -531
  39. coinex/ccxt/static_dependencies/ecdsa/rfc6979.py +0 -100
  40. coinex/ccxt/static_dependencies/ecdsa/util.py +0 -266
  41. coinex/ccxt/static_dependencies/ethereum/__init__.py +0 -7
  42. coinex/ccxt/static_dependencies/ethereum/abi/__init__.py +0 -16
  43. coinex/ccxt/static_dependencies/ethereum/abi/abi.py +0 -19
  44. coinex/ccxt/static_dependencies/ethereum/abi/base.py +0 -152
  45. coinex/ccxt/static_dependencies/ethereum/abi/codec.py +0 -217
  46. coinex/ccxt/static_dependencies/ethereum/abi/constants.py +0 -3
  47. coinex/ccxt/static_dependencies/ethereum/abi/decoding.py +0 -565
  48. coinex/ccxt/static_dependencies/ethereum/abi/encoding.py +0 -720
  49. coinex/ccxt/static_dependencies/ethereum/abi/exceptions.py +0 -139
  50. coinex/ccxt/static_dependencies/ethereum/abi/grammar.py +0 -443
  51. coinex/ccxt/static_dependencies/ethereum/abi/packed.py +0 -13
  52. coinex/ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  53. coinex/ccxt/static_dependencies/ethereum/abi/registry.py +0 -643
  54. coinex/ccxt/static_dependencies/ethereum/abi/tools/__init__.py +0 -3
  55. coinex/ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +0 -230
  56. coinex/ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  57. coinex/ccxt/static_dependencies/ethereum/abi/utils/numeric.py +0 -83
  58. coinex/ccxt/static_dependencies/ethereum/abi/utils/padding.py +0 -27
  59. coinex/ccxt/static_dependencies/ethereum/abi/utils/string.py +0 -19
  60. coinex/ccxt/static_dependencies/ethereum/account/__init__.py +0 -3
  61. coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +0 -4
  62. coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +0 -239
  63. coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +0 -40
  64. coinex/ccxt/static_dependencies/ethereum/account/messages.py +0 -263
  65. coinex/ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  66. coinex/ccxt/static_dependencies/ethereum/hexbytes/__init__.py +0 -5
  67. coinex/ccxt/static_dependencies/ethereum/hexbytes/_utils.py +0 -54
  68. coinex/ccxt/static_dependencies/ethereum/hexbytes/main.py +0 -65
  69. coinex/ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  70. coinex/ccxt/static_dependencies/ethereum/typing/__init__.py +0 -63
  71. coinex/ccxt/static_dependencies/ethereum/typing/abi.py +0 -6
  72. coinex/ccxt/static_dependencies/ethereum/typing/bls.py +0 -7
  73. coinex/ccxt/static_dependencies/ethereum/typing/discovery.py +0 -5
  74. coinex/ccxt/static_dependencies/ethereum/typing/encoding.py +0 -7
  75. coinex/ccxt/static_dependencies/ethereum/typing/enums.py +0 -17
  76. coinex/ccxt/static_dependencies/ethereum/typing/ethpm.py +0 -9
  77. coinex/ccxt/static_dependencies/ethereum/typing/evm.py +0 -20
  78. coinex/ccxt/static_dependencies/ethereum/typing/networks.py +0 -1122
  79. coinex/ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  80. coinex/ccxt/static_dependencies/ethereum/utils/__init__.py +0 -115
  81. coinex/ccxt/static_dependencies/ethereum/utils/abi.py +0 -72
  82. coinex/ccxt/static_dependencies/ethereum/utils/address.py +0 -171
  83. coinex/ccxt/static_dependencies/ethereum/utils/applicators.py +0 -151
  84. coinex/ccxt/static_dependencies/ethereum/utils/conversions.py +0 -190
  85. coinex/ccxt/static_dependencies/ethereum/utils/currency.py +0 -107
  86. coinex/ccxt/static_dependencies/ethereum/utils/curried/__init__.py +0 -269
  87. coinex/ccxt/static_dependencies/ethereum/utils/debug.py +0 -20
  88. coinex/ccxt/static_dependencies/ethereum/utils/decorators.py +0 -132
  89. coinex/ccxt/static_dependencies/ethereum/utils/encoding.py +0 -6
  90. coinex/ccxt/static_dependencies/ethereum/utils/exceptions.py +0 -4
  91. coinex/ccxt/static_dependencies/ethereum/utils/functional.py +0 -75
  92. coinex/ccxt/static_dependencies/ethereum/utils/hexadecimal.py +0 -74
  93. coinex/ccxt/static_dependencies/ethereum/utils/humanize.py +0 -188
  94. coinex/ccxt/static_dependencies/ethereum/utils/logging.py +0 -159
  95. coinex/ccxt/static_dependencies/ethereum/utils/module_loading.py +0 -31
  96. coinex/ccxt/static_dependencies/ethereum/utils/numeric.py +0 -43
  97. coinex/ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  98. coinex/ccxt/static_dependencies/ethereum/utils/toolz.py +0 -76
  99. coinex/ccxt/static_dependencies/ethereum/utils/types.py +0 -54
  100. coinex/ccxt/static_dependencies/ethereum/utils/typing/__init__.py +0 -18
  101. coinex/ccxt/static_dependencies/ethereum/utils/typing/misc.py +0 -14
  102. coinex/ccxt/static_dependencies/ethereum/utils/units.py +0 -31
  103. coinex/ccxt/static_dependencies/keccak/__init__.py +0 -3
  104. coinex/ccxt/static_dependencies/keccak/keccak.py +0 -197
  105. coinex/ccxt/static_dependencies/lark/__init__.py +0 -38
  106. coinex/ccxt/static_dependencies/lark/__pyinstaller/__init__.py +0 -6
  107. coinex/ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +0 -14
  108. coinex/ccxt/static_dependencies/lark/ast_utils.py +0 -59
  109. coinex/ccxt/static_dependencies/lark/common.py +0 -86
  110. coinex/ccxt/static_dependencies/lark/exceptions.py +0 -292
  111. coinex/ccxt/static_dependencies/lark/grammar.py +0 -130
  112. coinex/ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  113. coinex/ccxt/static_dependencies/lark/grammars/common.lark +0 -59
  114. coinex/ccxt/static_dependencies/lark/grammars/lark.lark +0 -62
  115. coinex/ccxt/static_dependencies/lark/grammars/python.lark +0 -302
  116. coinex/ccxt/static_dependencies/lark/grammars/unicode.lark +0 -7
  117. coinex/ccxt/static_dependencies/lark/indenter.py +0 -143
  118. coinex/ccxt/static_dependencies/lark/lark.py +0 -658
  119. coinex/ccxt/static_dependencies/lark/lexer.py +0 -678
  120. coinex/ccxt/static_dependencies/lark/load_grammar.py +0 -1428
  121. coinex/ccxt/static_dependencies/lark/parse_tree_builder.py +0 -391
  122. coinex/ccxt/static_dependencies/lark/parser_frontends.py +0 -257
  123. coinex/ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  124. coinex/ccxt/static_dependencies/lark/parsers/cyk.py +0 -340
  125. coinex/ccxt/static_dependencies/lark/parsers/earley.py +0 -314
  126. coinex/ccxt/static_dependencies/lark/parsers/earley_common.py +0 -42
  127. coinex/ccxt/static_dependencies/lark/parsers/earley_forest.py +0 -801
  128. coinex/ccxt/static_dependencies/lark/parsers/grammar_analysis.py +0 -203
  129. coinex/ccxt/static_dependencies/lark/parsers/lalr_analysis.py +0 -332
  130. coinex/ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +0 -158
  131. coinex/ccxt/static_dependencies/lark/parsers/lalr_parser.py +0 -122
  132. coinex/ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +0 -110
  133. coinex/ccxt/static_dependencies/lark/parsers/xearley.py +0 -165
  134. coinex/ccxt/static_dependencies/lark/py.typed +0 -0
  135. coinex/ccxt/static_dependencies/lark/reconstruct.py +0 -107
  136. coinex/ccxt/static_dependencies/lark/tools/__init__.py +0 -70
  137. coinex/ccxt/static_dependencies/lark/tools/nearley.py +0 -202
  138. coinex/ccxt/static_dependencies/lark/tools/serialize.py +0 -32
  139. coinex/ccxt/static_dependencies/lark/tools/standalone.py +0 -196
  140. coinex/ccxt/static_dependencies/lark/tree.py +0 -267
  141. coinex/ccxt/static_dependencies/lark/tree_matcher.py +0 -186
  142. coinex/ccxt/static_dependencies/lark/tree_templates.py +0 -180
  143. coinex/ccxt/static_dependencies/lark/utils.py +0 -343
  144. coinex/ccxt/static_dependencies/lark/visitors.py +0 -596
  145. coinex/ccxt/static_dependencies/marshmallow/__init__.py +0 -81
  146. coinex/ccxt/static_dependencies/marshmallow/base.py +0 -65
  147. coinex/ccxt/static_dependencies/marshmallow/class_registry.py +0 -94
  148. coinex/ccxt/static_dependencies/marshmallow/decorators.py +0 -231
  149. coinex/ccxt/static_dependencies/marshmallow/error_store.py +0 -60
  150. coinex/ccxt/static_dependencies/marshmallow/exceptions.py +0 -71
  151. coinex/ccxt/static_dependencies/marshmallow/fields.py +0 -2114
  152. coinex/ccxt/static_dependencies/marshmallow/orderedset.py +0 -89
  153. coinex/ccxt/static_dependencies/marshmallow/py.typed +0 -0
  154. coinex/ccxt/static_dependencies/marshmallow/schema.py +0 -1228
  155. coinex/ccxt/static_dependencies/marshmallow/types.py +0 -12
  156. coinex/ccxt/static_dependencies/marshmallow/utils.py +0 -378
  157. coinex/ccxt/static_dependencies/marshmallow/validate.py +0 -678
  158. coinex/ccxt/static_dependencies/marshmallow/warnings.py +0 -2
  159. coinex/ccxt/static_dependencies/marshmallow_dataclass/__init__.py +0 -1047
  160. coinex/ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +0 -51
  161. coinex/ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +0 -45
  162. coinex/ccxt/static_dependencies/marshmallow_dataclass/mypy.py +0 -71
  163. coinex/ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  164. coinex/ccxt/static_dependencies/marshmallow_dataclass/typing.py +0 -14
  165. coinex/ccxt/static_dependencies/marshmallow_dataclass/union_field.py +0 -82
  166. coinex/ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +0 -1
  167. coinex/ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +0 -193
  168. coinex/ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  169. coinex/ccxt/static_dependencies/msgpack/__init__.py +0 -55
  170. coinex/ccxt/static_dependencies/msgpack/_cmsgpack.pyx +0 -11
  171. coinex/ccxt/static_dependencies/msgpack/_packer.pyx +0 -374
  172. coinex/ccxt/static_dependencies/msgpack/_unpacker.pyx +0 -547
  173. coinex/ccxt/static_dependencies/msgpack/buff_converter.h +0 -8
  174. coinex/ccxt/static_dependencies/msgpack/exceptions.py +0 -48
  175. coinex/ccxt/static_dependencies/msgpack/ext.py +0 -168
  176. coinex/ccxt/static_dependencies/msgpack/fallback.py +0 -951
  177. coinex/ccxt/static_dependencies/msgpack/pack.h +0 -89
  178. coinex/ccxt/static_dependencies/msgpack/pack_template.h +0 -820
  179. coinex/ccxt/static_dependencies/msgpack/sysdep.h +0 -194
  180. coinex/ccxt/static_dependencies/msgpack/unpack.h +0 -391
  181. coinex/ccxt/static_dependencies/msgpack/unpack_define.h +0 -95
  182. coinex/ccxt/static_dependencies/msgpack/unpack_template.h +0 -464
  183. coinex/ccxt/static_dependencies/parsimonious/__init__.py +0 -10
  184. coinex/ccxt/static_dependencies/parsimonious/exceptions.py +0 -105
  185. coinex/ccxt/static_dependencies/parsimonious/expressions.py +0 -479
  186. coinex/ccxt/static_dependencies/parsimonious/grammar.py +0 -487
  187. coinex/ccxt/static_dependencies/parsimonious/nodes.py +0 -325
  188. coinex/ccxt/static_dependencies/parsimonious/utils.py +0 -40
  189. coinex/ccxt/static_dependencies/starknet/__init__.py +0 -0
  190. coinex/ccxt/static_dependencies/starknet/abi/v0/__init__.py +0 -2
  191. coinex/ccxt/static_dependencies/starknet/abi/v0/model.py +0 -44
  192. coinex/ccxt/static_dependencies/starknet/abi/v0/parser.py +0 -216
  193. coinex/ccxt/static_dependencies/starknet/abi/v0/schemas.py +0 -72
  194. coinex/ccxt/static_dependencies/starknet/abi/v0/shape.py +0 -63
  195. coinex/ccxt/static_dependencies/starknet/abi/v1/__init__.py +0 -2
  196. coinex/ccxt/static_dependencies/starknet/abi/v1/core_structures.json +0 -14
  197. coinex/ccxt/static_dependencies/starknet/abi/v1/model.py +0 -39
  198. coinex/ccxt/static_dependencies/starknet/abi/v1/parser.py +0 -220
  199. coinex/ccxt/static_dependencies/starknet/abi/v1/parser_transformer.py +0 -179
  200. coinex/ccxt/static_dependencies/starknet/abi/v1/schemas.py +0 -66
  201. coinex/ccxt/static_dependencies/starknet/abi/v1/shape.py +0 -47
  202. coinex/ccxt/static_dependencies/starknet/abi/v2/__init__.py +0 -2
  203. coinex/ccxt/static_dependencies/starknet/abi/v2/model.py +0 -89
  204. coinex/ccxt/static_dependencies/starknet/abi/v2/parser.py +0 -293
  205. coinex/ccxt/static_dependencies/starknet/abi/v2/parser_transformer.py +0 -192
  206. coinex/ccxt/static_dependencies/starknet/abi/v2/schemas.py +0 -132
  207. coinex/ccxt/static_dependencies/starknet/abi/v2/shape.py +0 -107
  208. coinex/ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  209. coinex/ccxt/static_dependencies/starknet/cairo/data_types.py +0 -123
  210. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  211. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +0 -77
  212. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +0 -46
  213. coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +0 -138
  214. coinex/ccxt/static_dependencies/starknet/cairo/felt.py +0 -64
  215. coinex/ccxt/static_dependencies/starknet/cairo/type_parser.py +0 -121
  216. coinex/ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  217. coinex/ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +0 -59
  218. coinex/ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  219. coinex/ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +0 -77
  220. coinex/ccxt/static_dependencies/starknet/ccxt_utils.py +0 -7
  221. coinex/ccxt/static_dependencies/starknet/common.py +0 -15
  222. coinex/ccxt/static_dependencies/starknet/constants.py +0 -39
  223. coinex/ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  224. coinex/ccxt/static_dependencies/starknet/hash/address.py +0 -79
  225. coinex/ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +0 -111
  226. coinex/ccxt/static_dependencies/starknet/hash/selector.py +0 -16
  227. coinex/ccxt/static_dependencies/starknet/hash/storage.py +0 -12
  228. coinex/ccxt/static_dependencies/starknet/hash/utils.py +0 -78
  229. coinex/ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  230. coinex/ccxt/static_dependencies/starknet/models/typed_data.py +0 -45
  231. coinex/ccxt/static_dependencies/starknet/serialization/__init__.py +0 -24
  232. coinex/ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +0 -40
  233. coinex/ccxt/static_dependencies/starknet/serialization/_context.py +0 -142
  234. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +0 -10
  235. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +0 -82
  236. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +0 -43
  237. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +0 -37
  238. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +0 -66
  239. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +0 -71
  240. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +0 -71
  241. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +0 -50
  242. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +0 -58
  243. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +0 -43
  244. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +0 -40
  245. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +0 -72
  246. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +0 -36
  247. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +0 -36
  248. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +0 -76
  249. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +0 -100
  250. coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +0 -32
  251. coinex/ccxt/static_dependencies/starknet/serialization/errors.py +0 -10
  252. coinex/ccxt/static_dependencies/starknet/serialization/factory.py +0 -229
  253. coinex/ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +0 -110
  254. coinex/ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +0 -59
  255. coinex/ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  256. coinex/ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +0 -86
  257. coinex/ccxt/static_dependencies/starknet/utils/iterable.py +0 -13
  258. coinex/ccxt/static_dependencies/starknet/utils/schema.py +0 -13
  259. coinex/ccxt/static_dependencies/starknet/utils/typed_data.py +0 -182
  260. coinex/ccxt/static_dependencies/starkware/__init__.py +0 -0
  261. coinex/ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  262. coinex/ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +0 -50
  263. coinex/ccxt/static_dependencies/starkware/crypto/math_utils.py +0 -78
  264. coinex/ccxt/static_dependencies/starkware/crypto/signature.py +0 -2344
  265. coinex/ccxt/static_dependencies/starkware/crypto/utils.py +0 -63
  266. coinex/ccxt/static_dependencies/sympy/__init__.py +0 -0
  267. coinex/ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  268. coinex/ccxt/static_dependencies/sympy/core/intfunc.py +0 -35
  269. coinex/ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  270. coinex/ccxt/static_dependencies/sympy/external/gmpy.py +0 -345
  271. coinex/ccxt/static_dependencies/sympy/external/importtools.py +0 -187
  272. coinex/ccxt/static_dependencies/sympy/external/ntheory.py +0 -637
  273. coinex/ccxt/static_dependencies/sympy/external/pythonmpq.py +0 -341
  274. coinex/ccxt/static_dependencies/toolz/__init__.py +0 -26
  275. coinex/ccxt/static_dependencies/toolz/_signatures.py +0 -784
  276. coinex/ccxt/static_dependencies/toolz/_version.py +0 -520
  277. coinex/ccxt/static_dependencies/toolz/compatibility.py +0 -30
  278. coinex/ccxt/static_dependencies/toolz/curried/__init__.py +0 -101
  279. coinex/ccxt/static_dependencies/toolz/curried/exceptions.py +0 -22
  280. coinex/ccxt/static_dependencies/toolz/curried/operator.py +0 -22
  281. coinex/ccxt/static_dependencies/toolz/dicttoolz.py +0 -339
  282. coinex/ccxt/static_dependencies/toolz/functoolz.py +0 -1049
  283. coinex/ccxt/static_dependencies/toolz/itertoolz.py +0 -1057
  284. coinex/ccxt/static_dependencies/toolz/recipes.py +0 -46
  285. coinex/ccxt/static_dependencies/toolz/utils.py +0 -9
  286. coinex/ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  287. coinex/ccxt/static_dependencies/typing_inspect/typing_inspect.py +0 -851
  288. coinex_api-0.0.14.dist-info/RECORD +0 -288
  289. {coinex_api-0.0.14.dist-info → coinex_api-0.0.15.dist-info}/WHEEL +0 -0
@@ -1,186 +0,0 @@
1
- """Tree matcher based on Lark grammar"""
2
-
3
- import re
4
- from collections import defaultdict
5
-
6
- from . import Tree, Token
7
- from .common import ParserConf
8
- from .parsers import earley
9
- from .grammar import Rule, Terminal, NonTerminal
10
-
11
-
12
- def is_discarded_terminal(t):
13
- return t.is_term and t.filter_out
14
-
15
-
16
- class _MakeTreeMatch:
17
- def __init__(self, name, expansion):
18
- self.name = name
19
- self.expansion = expansion
20
-
21
- def __call__(self, args):
22
- t = Tree(self.name, args)
23
- t.meta.match_tree = True
24
- t.meta.orig_expansion = self.expansion
25
- return t
26
-
27
-
28
- def _best_from_group(seq, group_key, cmp_key):
29
- d = {}
30
- for item in seq:
31
- key = group_key(item)
32
- if key in d:
33
- v1 = cmp_key(item)
34
- v2 = cmp_key(d[key])
35
- if v2 > v1:
36
- d[key] = item
37
- else:
38
- d[key] = item
39
- return list(d.values())
40
-
41
-
42
- def _best_rules_from_group(rules):
43
- rules = _best_from_group(rules, lambda r: r, lambda r: -len(r.expansion))
44
- rules.sort(key=lambda r: len(r.expansion))
45
- return rules
46
-
47
-
48
- def _match(term, token):
49
- if isinstance(token, Tree):
50
- name, _args = parse_rulename(term.name)
51
- return token.data == name
52
- elif isinstance(token, Token):
53
- return term == Terminal(token.type)
54
- assert False, (term, token)
55
-
56
-
57
- def make_recons_rule(origin, expansion, old_expansion):
58
- return Rule(origin, expansion, alias=_MakeTreeMatch(origin.name, old_expansion))
59
-
60
-
61
- def make_recons_rule_to_term(origin, term):
62
- return make_recons_rule(origin, [Terminal(term.name)], [term])
63
-
64
-
65
- def parse_rulename(s):
66
- "Parse rule names that may contain a template syntax (like rule{a, b, ...})"
67
- name, args_str = re.match(r'(\w+)(?:{(.+)})?', s).groups()
68
- args = args_str and [a.strip() for a in args_str.split(',')]
69
- return name, args
70
-
71
-
72
-
73
- class ChildrenLexer:
74
- def __init__(self, children):
75
- self.children = children
76
-
77
- def lex(self, parser_state):
78
- return self.children
79
-
80
- class TreeMatcher:
81
- """Match the elements of a tree node, based on an ontology
82
- provided by a Lark grammar.
83
-
84
- Supports templates and inlined rules (`rule{a, b,..}` and `_rule`)
85
-
86
- Initialize with an instance of Lark.
87
- """
88
-
89
- def __init__(self, parser):
90
- # XXX TODO calling compile twice returns different results!
91
- assert not parser.options.maybe_placeholders
92
- # XXX TODO: we just ignore the potential existence of a postlexer
93
- self.tokens, rules, _extra = parser.grammar.compile(parser.options.start, set())
94
-
95
- self.rules_for_root = defaultdict(list)
96
-
97
- self.rules = list(self._build_recons_rules(rules))
98
- self.rules.reverse()
99
-
100
- # Choose the best rule from each group of {rule => [rule.alias]}, since we only really need one derivation.
101
- self.rules = _best_rules_from_group(self.rules)
102
-
103
- self.parser = parser
104
- self._parser_cache = {}
105
-
106
- def _build_recons_rules(self, rules):
107
- "Convert tree-parsing/construction rules to tree-matching rules"
108
- expand1s = {r.origin for r in rules if r.options.expand1}
109
-
110
- aliases = defaultdict(list)
111
- for r in rules:
112
- if r.alias:
113
- aliases[r.origin].append(r.alias)
114
-
115
- rule_names = {r.origin for r in rules}
116
- nonterminals = {sym for sym in rule_names
117
- if sym.name.startswith('_') or sym in expand1s or sym in aliases}
118
-
119
- seen = set()
120
- for r in rules:
121
- recons_exp = [sym if sym in nonterminals else Terminal(sym.name)
122
- for sym in r.expansion if not is_discarded_terminal(sym)]
123
-
124
- # Skip self-recursive constructs
125
- if recons_exp == [r.origin] and r.alias is None:
126
- continue
127
-
128
- sym = NonTerminal(r.alias) if r.alias else r.origin
129
- rule = make_recons_rule(sym, recons_exp, r.expansion)
130
-
131
- if sym in expand1s and len(recons_exp) != 1:
132
- self.rules_for_root[sym.name].append(rule)
133
-
134
- if sym.name not in seen:
135
- yield make_recons_rule_to_term(sym, sym)
136
- seen.add(sym.name)
137
- else:
138
- if sym.name.startswith('_') or sym in expand1s:
139
- yield rule
140
- else:
141
- self.rules_for_root[sym.name].append(rule)
142
-
143
- for origin, rule_aliases in aliases.items():
144
- for alias in rule_aliases:
145
- yield make_recons_rule_to_term(origin, NonTerminal(alias))
146
- yield make_recons_rule_to_term(origin, origin)
147
-
148
- def match_tree(self, tree, rulename):
149
- """Match the elements of `tree` to the symbols of rule `rulename`.
150
-
151
- Parameters:
152
- tree (Tree): the tree node to match
153
- rulename (str): The expected full rule name (including template args)
154
-
155
- Returns:
156
- Tree: an unreduced tree that matches `rulename`
157
-
158
- Raises:
159
- UnexpectedToken: If no match was found.
160
-
161
- Note:
162
- It's the callers' responsibility match the tree recursively.
163
- """
164
- if rulename:
165
- # validate
166
- name, _args = parse_rulename(rulename)
167
- assert tree.data == name
168
- else:
169
- rulename = tree.data
170
-
171
- # TODO: ambiguity?
172
- try:
173
- parser = self._parser_cache[rulename]
174
- except KeyError:
175
- rules = self.rules + _best_rules_from_group(self.rules_for_root[rulename])
176
-
177
- # TODO pass callbacks through dict, instead of alias?
178
- callbacks = {rule: rule.alias for rule in rules}
179
- conf = ParserConf(rules, callbacks, [rulename])
180
- parser = earley.Parser(self.parser.lexer_conf, conf, _match, resolve_ambiguity=True)
181
- self._parser_cache[rulename] = parser
182
-
183
- # find a full derivation
184
- unreduced_tree = parser.parse(ChildrenLexer(tree.children), rulename)
185
- assert unreduced_tree.data == rulename
186
- return unreduced_tree
@@ -1,180 +0,0 @@
1
- """This module defines utilities for matching and translation tree templates.
2
-
3
- A tree templates is a tree that contains nodes that are template variables.
4
-
5
- """
6
-
7
- from typing import Union, Optional, Mapping, Dict, Tuple, Iterator
8
-
9
- from lark import Tree, Transformer
10
- from lark.exceptions import MissingVariableError
11
-
12
- Branch = Union[Tree[str], str]
13
- TreeOrCode = Union[Tree[str], str]
14
- MatchResult = Dict[str, Tree]
15
- _TEMPLATE_MARKER = '$'
16
-
17
-
18
- class TemplateConf:
19
- """Template Configuration
20
-
21
- Allows customization for different uses of Template
22
-
23
- parse() must return a Tree instance.
24
- """
25
-
26
- def __init__(self, parse=None):
27
- self._parse = parse
28
-
29
- def test_var(self, var: Union[Tree[str], str]) -> Optional[str]:
30
- """Given a tree node, if it is a template variable return its name. Otherwise, return None.
31
-
32
- This method may be overridden for customization
33
-
34
- Parameters:
35
- var: Tree | str - The tree node to test
36
-
37
- """
38
- if isinstance(var, str):
39
- return _get_template_name(var)
40
-
41
- if (
42
- isinstance(var, Tree)
43
- and var.data == "var"
44
- and len(var.children) > 0
45
- and isinstance(var.children[0], str)
46
- ):
47
- return _get_template_name(var.children[0])
48
-
49
- return None
50
-
51
- def _get_tree(self, template: TreeOrCode) -> Tree[str]:
52
- if isinstance(template, str):
53
- assert self._parse
54
- template = self._parse(template)
55
-
56
- if not isinstance(template, Tree):
57
- raise TypeError("template parser must return a Tree instance")
58
-
59
- return template
60
-
61
- def __call__(self, template: Tree[str]) -> 'Template':
62
- return Template(template, conf=self)
63
-
64
- def _match_tree_template(self, template: TreeOrCode, tree: Branch) -> Optional[MatchResult]:
65
- """Returns dict of {var: match} if found a match, else None
66
- """
67
- template_var = self.test_var(template)
68
- if template_var:
69
- if not isinstance(tree, Tree):
70
- raise TypeError(f"Template variables can only match Tree instances. Not {tree!r}")
71
- return {template_var: tree}
72
-
73
- if isinstance(template, str):
74
- if template == tree:
75
- return {}
76
- return None
77
-
78
- assert isinstance(template, Tree) and isinstance(tree, Tree), f"template={template} tree={tree}"
79
-
80
- if template.data == tree.data and len(template.children) == len(tree.children):
81
- res = {}
82
- for t1, t2 in zip(template.children, tree.children):
83
- matches = self._match_tree_template(t1, t2)
84
- if matches is None:
85
- return None
86
-
87
- res.update(matches)
88
-
89
- return res
90
-
91
- return None
92
-
93
-
94
- class _ReplaceVars(Transformer[str, Tree[str]]):
95
- def __init__(self, conf: TemplateConf, vars: Mapping[str, Tree[str]]) -> None:
96
- super().__init__()
97
- self._conf = conf
98
- self._vars = vars
99
-
100
- def __default__(self, data, children, meta) -> Tree[str]:
101
- tree = super().__default__(data, children, meta)
102
-
103
- var = self._conf.test_var(tree)
104
- if var:
105
- try:
106
- return self._vars[var]
107
- except KeyError:
108
- raise MissingVariableError(f"No mapping for template variable ({var})")
109
- return tree
110
-
111
-
112
- class Template:
113
- """Represents a tree template, tied to a specific configuration
114
-
115
- A tree template is a tree that contains nodes that are template variables.
116
- Those variables will match any tree.
117
- (future versions may support annotations on the variables, to allow more complex templates)
118
- """
119
-
120
- def __init__(self, tree: Tree[str], conf: TemplateConf = TemplateConf()):
121
- self.conf = conf
122
- self.tree = conf._get_tree(tree)
123
-
124
- def match(self, tree: TreeOrCode) -> Optional[MatchResult]:
125
- """Match a tree template to a tree.
126
-
127
- A tree template without variables will only match ``tree`` if it is equal to the template.
128
-
129
- Parameters:
130
- tree (Tree): The tree to match to the template
131
-
132
- Returns:
133
- Optional[Dict[str, Tree]]: If match is found, returns a dictionary mapping
134
- template variable names to their matching tree nodes.
135
- If no match was found, returns None.
136
- """
137
- tree = self.conf._get_tree(tree)
138
- return self.conf._match_tree_template(self.tree, tree)
139
-
140
- def search(self, tree: TreeOrCode) -> Iterator[Tuple[Tree[str], MatchResult]]:
141
- """Search for all occurrences of the tree template inside ``tree``.
142
- """
143
- tree = self.conf._get_tree(tree)
144
- for subtree in tree.iter_subtrees():
145
- res = self.match(subtree)
146
- if res:
147
- yield subtree, res
148
-
149
- def apply_vars(self, vars: Mapping[str, Tree[str]]) -> Tree[str]:
150
- """Apply vars to the template tree
151
- """
152
- return _ReplaceVars(self.conf, vars).transform(self.tree)
153
-
154
-
155
- def translate(t1: Template, t2: Template, tree: TreeOrCode):
156
- """Search tree and translate each occurrence of t1 into t2.
157
- """
158
- tree = t1.conf._get_tree(tree) # ensure it's a tree, parse if necessary and possible
159
- for subtree, vars in t1.search(tree):
160
- res = t2.apply_vars(vars)
161
- subtree.set(res.data, res.children)
162
- return tree
163
-
164
-
165
- class TemplateTranslator:
166
- """Utility class for translating a collection of patterns
167
- """
168
-
169
- def __init__(self, translations: Mapping[Template, Template]):
170
- assert all(isinstance(k, Template) and isinstance(v, Template) for k, v in translations.items())
171
- self.translations = translations
172
-
173
- def translate(self, tree: Tree[str]):
174
- for k, v in self.translations.items():
175
- tree = translate(k, v, tree)
176
- return tree
177
-
178
-
179
- def _get_template_name(value: str) -> Optional[str]:
180
- return value.lstrip(_TEMPLATE_MARKER) if value.startswith(_TEMPLATE_MARKER) else None
@@ -1,343 +0,0 @@
1
- import unicodedata
2
- import os
3
- from itertools import product
4
- from collections import deque
5
- from typing import Callable, Iterator, List, Optional, Tuple, Type, TypeVar, Union, Dict, Any, Sequence, Iterable, AbstractSet
6
-
7
- ###{standalone
8
- import sys, re
9
- import logging
10
-
11
- logger: logging.Logger = logging.getLogger("lark")
12
- logger.addHandler(logging.StreamHandler())
13
- # Set to highest level, since we have some warnings amongst the code
14
- # By default, we should not output any log messages
15
- logger.setLevel(logging.CRITICAL)
16
-
17
-
18
- NO_VALUE = object()
19
-
20
- T = TypeVar("T")
21
-
22
-
23
- def classify(seq: Iterable, key: Optional[Callable] = None, value: Optional[Callable] = None) -> Dict:
24
- d: Dict[Any, Any] = {}
25
- for item in seq:
26
- k = key(item) if (key is not None) else item
27
- v = value(item) if (value is not None) else item
28
- try:
29
- d[k].append(v)
30
- except KeyError:
31
- d[k] = [v]
32
- return d
33
-
34
-
35
- def _deserialize(data: Any, namespace: Dict[str, Any], memo: Dict) -> Any:
36
- if isinstance(data, dict):
37
- if '__type__' in data: # Object
38
- class_ = namespace[data['__type__']]
39
- return class_.deserialize(data, memo)
40
- elif '@' in data:
41
- return memo[data['@']]
42
- return {key:_deserialize(value, namespace, memo) for key, value in data.items()}
43
- elif isinstance(data, list):
44
- return [_deserialize(value, namespace, memo) for value in data]
45
- return data
46
-
47
-
48
- _T = TypeVar("_T", bound="Serialize")
49
-
50
- class Serialize:
51
- """Safe-ish serialization interface that doesn't rely on Pickle
52
-
53
- Attributes:
54
- __serialize_fields__ (List[str]): Fields (aka attributes) to serialize.
55
- __serialize_namespace__ (list): List of classes that deserialization is allowed to instantiate.
56
- Should include all field types that aren't builtin types.
57
- """
58
-
59
- def memo_serialize(self, types_to_memoize: List) -> Any:
60
- memo = SerializeMemoizer(types_to_memoize)
61
- return self.serialize(memo), memo.serialize()
62
-
63
- def serialize(self, memo = None) -> Dict[str, Any]:
64
- if memo and memo.in_types(self):
65
- return {'@': memo.memoized.get(self)}
66
-
67
- fields = getattr(self, '__serialize_fields__')
68
- res = {f: _serialize(getattr(self, f), memo) for f in fields}
69
- res['__type__'] = type(self).__name__
70
- if hasattr(self, '_serialize'):
71
- self._serialize(res, memo)
72
- return res
73
-
74
- @classmethod
75
- def deserialize(cls: Type[_T], data: Dict[str, Any], memo: Dict[int, Any]) -> _T:
76
- namespace = getattr(cls, '__serialize_namespace__', [])
77
- namespace = {c.__name__:c for c in namespace}
78
-
79
- fields = getattr(cls, '__serialize_fields__')
80
-
81
- if '@' in data:
82
- return memo[data['@']]
83
-
84
- inst = cls.__new__(cls)
85
- for f in fields:
86
- try:
87
- setattr(inst, f, _deserialize(data[f], namespace, memo))
88
- except KeyError as e:
89
- raise KeyError("Cannot find key for class", cls, e)
90
-
91
- if hasattr(inst, '_deserialize'):
92
- inst._deserialize()
93
-
94
- return inst
95
-
96
-
97
- class SerializeMemoizer(Serialize):
98
- "A version of serialize that memoizes objects to reduce space"
99
-
100
- __serialize_fields__ = 'memoized',
101
-
102
- def __init__(self, types_to_memoize: List) -> None:
103
- self.types_to_memoize = tuple(types_to_memoize)
104
- self.memoized = Enumerator()
105
-
106
- def in_types(self, value: Serialize) -> bool:
107
- return isinstance(value, self.types_to_memoize)
108
-
109
- def serialize(self) -> Dict[int, Any]: # type: ignore[override]
110
- return _serialize(self.memoized.reversed(), None)
111
-
112
- @classmethod
113
- def deserialize(cls, data: Dict[int, Any], namespace: Dict[str, Any], memo: Dict[Any, Any]) -> Dict[int, Any]: # type: ignore[override]
114
- return _deserialize(data, namespace, memo)
115
-
116
-
117
- try:
118
- import regex
119
- _has_regex = True
120
- except ImportError:
121
- _has_regex = False
122
-
123
- if sys.version_info >= (3, 11):
124
- import re._parser as sre_parse
125
- import re._constants as sre_constants
126
- else:
127
- import sre_parse
128
- import sre_constants
129
-
130
- categ_pattern = re.compile(r'\\p{[A-Za-z_]+}')
131
-
132
- def get_regexp_width(expr: str) -> Union[Tuple[int, int], List[int]]:
133
- if _has_regex:
134
- # Since `sre_parse` cannot deal with Unicode categories of the form `\p{Mn}`, we replace these with
135
- # a simple letter, which makes no difference as we are only trying to get the possible lengths of the regex
136
- # match here below.
137
- regexp_final = re.sub(categ_pattern, 'A', expr)
138
- else:
139
- if re.search(categ_pattern, expr):
140
- raise ImportError('`regex` module must be installed in order to use Unicode categories.', expr)
141
- regexp_final = expr
142
- try:
143
- # Fixed in next version (past 0.960) of typeshed
144
- return [int(x) for x in sre_parse.parse(regexp_final).getwidth()]
145
- except sre_constants.error:
146
- if not _has_regex:
147
- raise ValueError(expr)
148
- else:
149
- # sre_parse does not support the new features in regex. To not completely fail in that case,
150
- # we manually test for the most important info (whether the empty string is matched)
151
- c = regex.compile(regexp_final)
152
- # Python 3.11.7 introducded sre_parse.MAXWIDTH that is used instead of MAXREPEAT
153
- # See lark-parser/lark#1376 and python/cpython#109859
154
- MAXWIDTH = getattr(sre_parse, "MAXWIDTH", sre_constants.MAXREPEAT)
155
- if c.match('') is None:
156
- # MAXREPEAT is a none pickable subclass of int, therefore needs to be converted to enable caching
157
- return 1, int(MAXWIDTH)
158
- else:
159
- return 0, int(MAXWIDTH)
160
-
161
- ###}
162
-
163
-
164
- _ID_START = 'Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Mn', 'Mc', 'Pc'
165
- _ID_CONTINUE = _ID_START + ('Nd', 'Nl',)
166
-
167
- def _test_unicode_category(s: str, categories: Sequence[str]) -> bool:
168
- if len(s) != 1:
169
- return all(_test_unicode_category(char, categories) for char in s)
170
- return s == '_' or unicodedata.category(s) in categories
171
-
172
- def is_id_continue(s: str) -> bool:
173
- """
174
- Checks if all characters in `s` are alphanumeric characters (Unicode standard, so diacritics, indian vowels, non-latin
175
- numbers, etc. all pass). Synonymous with a Python `ID_CONTINUE` identifier. See PEP 3131 for details.
176
- """
177
- return _test_unicode_category(s, _ID_CONTINUE)
178
-
179
- def is_id_start(s: str) -> bool:
180
- """
181
- Checks if all characters in `s` are alphabetic characters (Unicode standard, so diacritics, indian vowels, non-latin
182
- numbers, etc. all pass). Synonymous with a Python `ID_START` identifier. See PEP 3131 for details.
183
- """
184
- return _test_unicode_category(s, _ID_START)
185
-
186
-
187
- def dedup_list(l: Sequence[T]) -> List[T]:
188
- """Given a list (l) will removing duplicates from the list,
189
- preserving the original order of the list. Assumes that
190
- the list entries are hashable."""
191
- return list(dict.fromkeys(l))
192
-
193
-
194
- class Enumerator(Serialize):
195
- def __init__(self) -> None:
196
- self.enums: Dict[Any, int] = {}
197
-
198
- def get(self, item) -> int:
199
- if item not in self.enums:
200
- self.enums[item] = len(self.enums)
201
- return self.enums[item]
202
-
203
- def __len__(self):
204
- return len(self.enums)
205
-
206
- def reversed(self) -> Dict[int, Any]:
207
- r = {v: k for k, v in self.enums.items()}
208
- assert len(r) == len(self.enums)
209
- return r
210
-
211
-
212
-
213
- def combine_alternatives(lists):
214
- """
215
- Accepts a list of alternatives, and enumerates all their possible concatenations.
216
-
217
- Examples:
218
- >>> combine_alternatives([range(2), [4,5]])
219
- [[0, 4], [0, 5], [1, 4], [1, 5]]
220
-
221
- >>> combine_alternatives(["abc", "xy", '$'])
222
- [['a', 'x', '$'], ['a', 'y', '$'], ['b', 'x', '$'], ['b', 'y', '$'], ['c', 'x', '$'], ['c', 'y', '$']]
223
-
224
- >>> combine_alternatives([])
225
- [[]]
226
- """
227
- if not lists:
228
- return [[]]
229
- assert all(l for l in lists), lists
230
- return list(product(*lists))
231
-
232
- try:
233
- import atomicwrites
234
- _has_atomicwrites = True
235
- except ImportError:
236
- _has_atomicwrites = False
237
-
238
- class FS:
239
- exists = staticmethod(os.path.exists)
240
-
241
- @staticmethod
242
- def open(name, mode="r", **kwargs):
243
- if _has_atomicwrites and "w" in mode:
244
- return atomicwrites.atomic_write(name, mode=mode, overwrite=True, **kwargs)
245
- else:
246
- return open(name, mode, **kwargs)
247
-
248
-
249
- class fzset(frozenset):
250
- def __repr__(self):
251
- return '{%s}' % ', '.join(map(repr, self))
252
-
253
-
254
- def classify_bool(seq: Iterable, pred: Callable) -> Any:
255
- false_elems = []
256
- true_elems = [elem for elem in seq if pred(elem) or false_elems.append(elem)] # type: ignore[func-returns-value]
257
- return true_elems, false_elems
258
-
259
-
260
- def bfs(initial: Iterable, expand: Callable) -> Iterator:
261
- open_q = deque(list(initial))
262
- visited = set(open_q)
263
- while open_q:
264
- node = open_q.popleft()
265
- yield node
266
- for next_node in expand(node):
267
- if next_node not in visited:
268
- visited.add(next_node)
269
- open_q.append(next_node)
270
-
271
- def bfs_all_unique(initial, expand):
272
- "bfs, but doesn't keep track of visited (aka seen), because there can be no repetitions"
273
- open_q = deque(list(initial))
274
- while open_q:
275
- node = open_q.popleft()
276
- yield node
277
- open_q += expand(node)
278
-
279
-
280
- def _serialize(value: Any, memo: Optional[SerializeMemoizer]) -> Any:
281
- if isinstance(value, Serialize):
282
- return value.serialize(memo)
283
- elif isinstance(value, list):
284
- return [_serialize(elem, memo) for elem in value]
285
- elif isinstance(value, frozenset):
286
- return list(value) # TODO reversible?
287
- elif isinstance(value, dict):
288
- return {key:_serialize(elem, memo) for key, elem in value.items()}
289
- # assert value is None or isinstance(value, (int, float, str, tuple)), value
290
- return value
291
-
292
-
293
-
294
-
295
- def small_factors(n: int, max_factor: int) -> List[Tuple[int, int]]:
296
- """
297
- Splits n up into smaller factors and summands <= max_factor.
298
- Returns a list of [(a, b), ...]
299
- so that the following code returns n:
300
-
301
- n = 1
302
- for a, b in values:
303
- n = n * a + b
304
-
305
- Currently, we also keep a + b <= max_factor, but that might change
306
- """
307
- assert n >= 0
308
- assert max_factor > 2
309
- if n <= max_factor:
310
- return [(n, 0)]
311
-
312
- for a in range(max_factor, 1, -1):
313
- r, b = divmod(n, a)
314
- if a + b <= max_factor:
315
- return small_factors(r, max_factor) + [(a, b)]
316
- assert False, "Failed to factorize %s" % n
317
-
318
-
319
- class OrderedSet(AbstractSet[T]):
320
- """A minimal OrderedSet implementation, using a dictionary.
321
-
322
- (relies on the dictionary being ordered)
323
- """
324
- def __init__(self, items: Iterable[T] =()):
325
- self.d = dict.fromkeys(items)
326
-
327
- def __contains__(self, item: Any) -> bool:
328
- return item in self.d
329
-
330
- def add(self, item: T):
331
- self.d[item] = None
332
-
333
- def __iter__(self) -> Iterator[T]:
334
- return iter(self.d)
335
-
336
- def remove(self, item: T):
337
- del self.d[item]
338
-
339
- def __bool__(self):
340
- return bool(self.d)
341
-
342
- def __len__(self) -> int:
343
- return len(self.d)