arctrl 3.0.0a3__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 (456) hide show
  1. arctrl/__init__.py +18 -0
  2. arctrl/py/CWL/__init__.py +0 -0
  3. arctrl/py/CWL/cwltypes.py +150 -0
  4. arctrl/py/CWL/decode.py +973 -0
  5. arctrl/py/CWL/encode.py +1 -0
  6. arctrl/py/CWL/inputs.py +88 -0
  7. arctrl/py/CWL/outputs.py +85 -0
  8. arctrl/py/CWL/requirements.py +77 -0
  9. arctrl/py/CWL/tool_description.py +103 -0
  10. arctrl/py/CWL/workflow_description.py +104 -0
  11. arctrl/py/CWL/workflow_steps.py +113 -0
  12. arctrl/py/Contract/__init__.py +0 -0
  13. arctrl/py/Contract/arc.py +60 -0
  14. arctrl/py/Contract/arc_assay.py +125 -0
  15. arctrl/py/Contract/arc_investigation.py +88 -0
  16. arctrl/py/Contract/arc_run.py +125 -0
  17. arctrl/py/Contract/arc_study.py +126 -0
  18. arctrl/py/Contract/arc_workflow.py +125 -0
  19. arctrl/py/Contract/contract.py +153 -0
  20. arctrl/py/Contract/datamap.py +372 -0
  21. arctrl/py/Contract/git.py +118 -0
  22. arctrl/py/Contract/validation_packages_config.py +107 -0
  23. arctrl/py/ContractIO/__init__.py +0 -0
  24. arctrl/py/ContractIO/contract_io.py +344 -0
  25. arctrl/py/ContractIO/file_system_helper.py +264 -0
  26. arctrl/py/Core/Helper/__init__.py +0 -0
  27. arctrl/py/Core/Helper/collections_.py +438 -0
  28. arctrl/py/Core/Helper/date_time.py +26 -0
  29. arctrl/py/Core/Helper/hash_codes.py +60 -0
  30. arctrl/py/Core/Helper/identifier.py +248 -0
  31. arctrl/py/Core/Helper/orcid.py +42 -0
  32. arctrl/py/Core/Helper/printer.py +13 -0
  33. arctrl/py/Core/Helper/regex.py +554 -0
  34. arctrl/py/Core/Helper/sem_ver.py +71 -0
  35. arctrl/py/Core/Helper/url.py +148 -0
  36. arctrl/py/Core/Process/__init__.py +0 -0
  37. arctrl/py/Core/Process/column_index.py +280 -0
  38. arctrl/py/Core/Process/component.py +200 -0
  39. arctrl/py/Core/Process/factor.py +151 -0
  40. arctrl/py/Core/Process/factor_value.py +182 -0
  41. arctrl/py/Core/Process/material.py +74 -0
  42. arctrl/py/Core/Process/material_attribute.py +95 -0
  43. arctrl/py/Core/Process/material_attribute_value.py +184 -0
  44. arctrl/py/Core/Process/material_type.py +45 -0
  45. arctrl/py/Core/Process/process.py +477 -0
  46. arctrl/py/Core/Process/process_input.py +265 -0
  47. arctrl/py/Core/Process/process_output.py +235 -0
  48. arctrl/py/Core/Process/process_parameter_value.py +200 -0
  49. arctrl/py/Core/Process/process_sequence.py +435 -0
  50. arctrl/py/Core/Process/protocol.py +175 -0
  51. arctrl/py/Core/Process/protocol_parameter.py +98 -0
  52. arctrl/py/Core/Process/sample.py +82 -0
  53. arctrl/py/Core/Process/source.py +62 -0
  54. arctrl/py/Core/Table/__init__.py +0 -0
  55. arctrl/py/Core/Table/arc_table.py +1264 -0
  56. arctrl/py/Core/Table/arc_table_aux.py +575 -0
  57. arctrl/py/Core/Table/arc_tables.py +591 -0
  58. arctrl/py/Core/Table/composite_cell.py +319 -0
  59. arctrl/py/Core/Table/composite_column.py +73 -0
  60. arctrl/py/Core/Table/composite_header.py +739 -0
  61. arctrl/py/Core/__init__.py +0 -0
  62. arctrl/py/Core/arc_types.py +5064 -0
  63. arctrl/py/Core/comment.py +128 -0
  64. arctrl/py/Core/comment_list.py +127 -0
  65. arctrl/py/Core/conversion.py +1313 -0
  66. arctrl/py/Core/data.py +245 -0
  67. arctrl/py/Core/data_context.py +157 -0
  68. arctrl/py/Core/data_file.py +112 -0
  69. arctrl/py/Core/data_map.py +225 -0
  70. arctrl/py/Core/identifier_setters.py +31 -0
  71. arctrl/py/Core/iproperty_value.py +36 -0
  72. arctrl/py/Core/ontology_annotation.py +299 -0
  73. arctrl/py/Core/ontology_source_reference.py +114 -0
  74. arctrl/py/Core/person.py +259 -0
  75. arctrl/py/Core/publication.py +161 -0
  76. arctrl/py/Core/template.py +231 -0
  77. arctrl/py/Core/templates.py +148 -0
  78. arctrl/py/Core/uri.py +11 -0
  79. arctrl/py/Core/value.py +188 -0
  80. arctrl/py/FileSystem/__init__.py +0 -0
  81. arctrl/py/FileSystem/commit.py +21 -0
  82. arctrl/py/FileSystem/default_gitattributes.py +5 -0
  83. arctrl/py/FileSystem/default_gitignore.py +5 -0
  84. arctrl/py/FileSystem/file_system.py +58 -0
  85. arctrl/py/FileSystem/file_system_tree.py +426 -0
  86. arctrl/py/FileSystem/path.py +64 -0
  87. arctrl/py/Json/DataMap/__init__.py +0 -0
  88. arctrl/py/Json/DataMap/data_context.py +101 -0
  89. arctrl/py/Json/DataMap/data_map.py +53 -0
  90. arctrl/py/Json/Process/__init__.py +0 -0
  91. arctrl/py/Json/Process/assay_materials.py +46 -0
  92. arctrl/py/Json/Process/component.py +79 -0
  93. arctrl/py/Json/Process/factor.py +107 -0
  94. arctrl/py/Json/Process/factor_value.py +101 -0
  95. arctrl/py/Json/Process/material.py +226 -0
  96. arctrl/py/Json/Process/material_attribute.py +79 -0
  97. arctrl/py/Json/Process/material_attribute_value.py +101 -0
  98. arctrl/py/Json/Process/material_type.py +53 -0
  99. arctrl/py/Json/Process/process.py +296 -0
  100. arctrl/py/Json/Process/process_input.py +83 -0
  101. arctrl/py/Json/Process/process_output.py +67 -0
  102. arctrl/py/Json/Process/process_parameter_value.py +81 -0
  103. arctrl/py/Json/Process/protocol.py +354 -0
  104. arctrl/py/Json/Process/protocol_parameter.py +79 -0
  105. arctrl/py/Json/Process/sample.py +277 -0
  106. arctrl/py/Json/Process/source.py +214 -0
  107. arctrl/py/Json/Process/study_materials.py +52 -0
  108. arctrl/py/Json/Process/value.py +56 -0
  109. arctrl/py/Json/ROCrate/__init__.py +0 -0
  110. arctrl/py/Json/ROCrate/ldcontext.py +133 -0
  111. arctrl/py/Json/ROCrate/ldgraph.py +111 -0
  112. arctrl/py/Json/ROCrate/ldnode.py +290 -0
  113. arctrl/py/Json/ROCrate/ldref.py +44 -0
  114. arctrl/py/Json/ROCrate/ldvalue.py +102 -0
  115. arctrl/py/Json/Table/__init__.py +0 -0
  116. arctrl/py/Json/Table/arc_table.py +393 -0
  117. arctrl/py/Json/Table/cell_table.py +83 -0
  118. arctrl/py/Json/Table/composite_cell.py +136 -0
  119. arctrl/py/Json/Table/composite_header.py +67 -0
  120. arctrl/py/Json/Table/iotype.py +24 -0
  121. arctrl/py/Json/Table/oatable.py +82 -0
  122. arctrl/py/Json/Table/templates.py +281 -0
  123. arctrl/py/Json/__init__.py +0 -0
  124. arctrl/py/Json/assay.py +600 -0
  125. arctrl/py/Json/comment.py +206 -0
  126. arctrl/py/Json/context/rocrate/__init__.py +0 -0
  127. arctrl/py/Json/context/rocrate/isa_assay_context.py +101 -0
  128. arctrl/py/Json/context/rocrate/isa_comment_context.py +60 -0
  129. arctrl/py/Json/context/rocrate/isa_component_context.py +77 -0
  130. arctrl/py/Json/context/rocrate/isa_data_context.py +74 -0
  131. arctrl/py/Json/context/rocrate/isa_factor_context.py +74 -0
  132. arctrl/py/Json/context/rocrate/isa_factor_value_context.py +84 -0
  133. arctrl/py/Json/context/rocrate/isa_investigation_context.py +110 -0
  134. arctrl/py/Json/context/rocrate/isa_material_attribute_context.py +64 -0
  135. arctrl/py/Json/context/rocrate/isa_material_attribute_value_context.py +80 -0
  136. arctrl/py/Json/context/rocrate/isa_material_context.py +71 -0
  137. arctrl/py/Json/context/rocrate/isa_ontology_annotation_context.py +68 -0
  138. arctrl/py/Json/context/rocrate/isa_ontology_source_reference_context.py +75 -0
  139. arctrl/py/Json/context/rocrate/isa_organization_context.py +55 -0
  140. arctrl/py/Json/context/rocrate/isa_person_context.py +131 -0
  141. arctrl/py/Json/context/rocrate/isa_process_context.py +94 -0
  142. arctrl/py/Json/context/rocrate/isa_process_parameter_value_context.py +80 -0
  143. arctrl/py/Json/context/rocrate/isa_protocol_context.py +97 -0
  144. arctrl/py/Json/context/rocrate/isa_protocol_parameter_context.py +64 -0
  145. arctrl/py/Json/context/rocrate/isa_publication_context.py +78 -0
  146. arctrl/py/Json/context/rocrate/isa_sample_context.py +65 -0
  147. arctrl/py/Json/context/rocrate/isa_source_context.py +66 -0
  148. arctrl/py/Json/context/rocrate/isa_study_context.py +125 -0
  149. arctrl/py/Json/context/rocrate/property_value_context.py +73 -0
  150. arctrl/py/Json/context/rocrate/rocrate_context.py +81 -0
  151. arctrl/py/Json/converter_options.py +23 -0
  152. arctrl/py/Json/data.py +356 -0
  153. arctrl/py/Json/data_file.py +63 -0
  154. arctrl/py/Json/decode.py +155 -0
  155. arctrl/py/Json/encode.py +92 -0
  156. arctrl/py/Json/idtable.py +44 -0
  157. arctrl/py/Json/investigation.py +695 -0
  158. arctrl/py/Json/ontology_annotation.py +404 -0
  159. arctrl/py/Json/ontology_source_reference.py +255 -0
  160. arctrl/py/Json/person.py +658 -0
  161. arctrl/py/Json/property_value.py +359 -0
  162. arctrl/py/Json/publication.py +279 -0
  163. arctrl/py/Json/string_table.py +76 -0
  164. arctrl/py/Json/study.py +793 -0
  165. arctrl/py/JsonIO/DataMap/__init__.py +0 -0
  166. arctrl/py/JsonIO/DataMap/data_map.py +53 -0
  167. arctrl/py/JsonIO/Process/__init__.py +0 -0
  168. arctrl/py/JsonIO/Process/component.py +60 -0
  169. arctrl/py/JsonIO/Process/factor.py +36 -0
  170. arctrl/py/JsonIO/Process/factor_value.py +38 -0
  171. arctrl/py/JsonIO/Process/material.py +60 -0
  172. arctrl/py/JsonIO/Process/material_attribute.py +38 -0
  173. arctrl/py/JsonIO/Process/material_attribute_value.py +60 -0
  174. arctrl/py/JsonIO/Process/material_type.py +36 -0
  175. arctrl/py/JsonIO/Process/process.py +60 -0
  176. arctrl/py/JsonIO/Process/process_input.py +38 -0
  177. arctrl/py/JsonIO/Process/process_output.py +60 -0
  178. arctrl/py/JsonIO/Process/process_parameter_value.py +60 -0
  179. arctrl/py/JsonIO/Process/process_sequence.py +71 -0
  180. arctrl/py/JsonIO/Process/protocol.py +60 -0
  181. arctrl/py/JsonIO/Process/protocol_parameter.py +36 -0
  182. arctrl/py/JsonIO/Process/sample.py +60 -0
  183. arctrl/py/JsonIO/Process/source.py +60 -0
  184. arctrl/py/JsonIO/Process/study_materials.py +52 -0
  185. arctrl/py/JsonIO/Process/value.py +32 -0
  186. arctrl/py/JsonIO/Table/__init__.py +0 -0
  187. arctrl/py/JsonIO/Table/arc_table.py +121 -0
  188. arctrl/py/JsonIO/Table/composite_cell.py +36 -0
  189. arctrl/py/JsonIO/Table/composite_header.py +36 -0
  190. arctrl/py/JsonIO/Table/compression.py +85 -0
  191. arctrl/py/JsonIO/Table/iotype.py +36 -0
  192. arctrl/py/JsonIO/Table/templates.py +113 -0
  193. arctrl/py/JsonIO/__init__.py +0 -0
  194. arctrl/py/JsonIO/assay.py +113 -0
  195. arctrl/py/JsonIO/comment.py +80 -0
  196. arctrl/py/JsonIO/data.py +60 -0
  197. arctrl/py/JsonIO/data_file.py +58 -0
  198. arctrl/py/JsonIO/decode.py +9 -0
  199. arctrl/py/JsonIO/encode.py +1 -0
  200. arctrl/py/JsonIO/investigation.py +113 -0
  201. arctrl/py/JsonIO/ldobject.py +106 -0
  202. arctrl/py/JsonIO/ontology_annotation.py +80 -0
  203. arctrl/py/JsonIO/ontology_source_reference.py +80 -0
  204. arctrl/py/JsonIO/person.py +82 -0
  205. arctrl/py/JsonIO/publication.py +82 -0
  206. arctrl/py/JsonIO/study.py +114 -0
  207. arctrl/py/ROCrate/Generic/__init__.py +0 -0
  208. arctrl/py/ROCrate/Generic/comment.py +131 -0
  209. arctrl/py/ROCrate/Generic/dataset.py +817 -0
  210. arctrl/py/ROCrate/Generic/defined_term.py +131 -0
  211. arctrl/py/ROCrate/Generic/file.py +237 -0
  212. arctrl/py/ROCrate/Generic/lab_process.py +324 -0
  213. arctrl/py/ROCrate/Generic/lab_protocol.py +338 -0
  214. arctrl/py/ROCrate/Generic/organization.py +83 -0
  215. arctrl/py/ROCrate/Generic/person.py +484 -0
  216. arctrl/py/ROCrate/Generic/postal_address.py +195 -0
  217. arctrl/py/ROCrate/Generic/property_value.py +696 -0
  218. arctrl/py/ROCrate/Generic/sample.py +202 -0
  219. arctrl/py/ROCrate/Generic/scholarly_article.py +229 -0
  220. arctrl/py/ROCrate/ISAProfile/__init__.py +0 -0
  221. arctrl/py/ROCrate/ISAProfile/assay.py +70 -0
  222. arctrl/py/ROCrate/ISAProfile/data.py +65 -0
  223. arctrl/py/ROCrate/ISAProfile/dataset.py +24 -0
  224. arctrl/py/ROCrate/ISAProfile/investigation.py +73 -0
  225. arctrl/py/ROCrate/ISAProfile/lab_process.py +162 -0
  226. arctrl/py/ROCrate/ISAProfile/lab_protocol.py +37 -0
  227. arctrl/py/ROCrate/ISAProfile/person.py +72 -0
  228. arctrl/py/ROCrate/ISAProfile/property_value.py +98 -0
  229. arctrl/py/ROCrate/ISAProfile/sample.py +64 -0
  230. arctrl/py/ROCrate/ISAProfile/scholarly_article.py +98 -0
  231. arctrl/py/ROCrate/ISAProfile/study.py +74 -0
  232. arctrl/py/ROCrate/__init__.py +0 -0
  233. arctrl/py/ROCrate/arc_rocrate_metadata.py +39 -0
  234. arctrl/py/ROCrate/dyn_obj_extensions.py +1 -0
  235. arctrl/py/ROCrate/helper.py +8 -0
  236. arctrl/py/ROCrate/ldcontext.py +362 -0
  237. arctrl/py/ROCrate/ldobject.py +1247 -0
  238. arctrl/py/ROCrate/rocrate_context.py +51 -0
  239. arctrl/py/Spreadsheet/AnnotationTable/__init__.py +0 -0
  240. arctrl/py/Spreadsheet/AnnotationTable/arc_table.py +193 -0
  241. arctrl/py/Spreadsheet/AnnotationTable/composite_cell.py +78 -0
  242. arctrl/py/Spreadsheet/AnnotationTable/composite_column.py +210 -0
  243. arctrl/py/Spreadsheet/AnnotationTable/composite_header.py +623 -0
  244. arctrl/py/Spreadsheet/DataMapTable/__init__.py +0 -0
  245. arctrl/py/Spreadsheet/DataMapTable/data_map_column.py +114 -0
  246. arctrl/py/Spreadsheet/DataMapTable/data_map_header.py +618 -0
  247. arctrl/py/Spreadsheet/DataMapTable/data_map_table.py +119 -0
  248. arctrl/py/Spreadsheet/Metadata/__init__.py +0 -0
  249. arctrl/py/Spreadsheet/Metadata/assays.py +125 -0
  250. arctrl/py/Spreadsheet/Metadata/comment.py +77 -0
  251. arctrl/py/Spreadsheet/Metadata/contacts.py +134 -0
  252. arctrl/py/Spreadsheet/Metadata/conversions.py +190 -0
  253. arctrl/py/Spreadsheet/Metadata/design_descriptors.py +34 -0
  254. arctrl/py/Spreadsheet/Metadata/factors.py +107 -0
  255. arctrl/py/Spreadsheet/Metadata/ontology_annotation.py +88 -0
  256. arctrl/py/Spreadsheet/Metadata/ontology_source_reference.py +96 -0
  257. arctrl/py/Spreadsheet/Metadata/protocols.py +146 -0
  258. arctrl/py/Spreadsheet/Metadata/publication.py +122 -0
  259. arctrl/py/Spreadsheet/Metadata/run.py +122 -0
  260. arctrl/py/Spreadsheet/Metadata/sparse_table.py +508 -0
  261. arctrl/py/Spreadsheet/Metadata/study.py +312 -0
  262. arctrl/py/Spreadsheet/Metadata/workflow.py +151 -0
  263. arctrl/py/Spreadsheet/__init__.py +0 -0
  264. arctrl/py/Spreadsheet/arc_assay.py +233 -0
  265. arctrl/py/Spreadsheet/arc_investigation.py +418 -0
  266. arctrl/py/Spreadsheet/arc_run.py +190 -0
  267. arctrl/py/Spreadsheet/arc_study.py +144 -0
  268. arctrl/py/Spreadsheet/arc_workflow.py +176 -0
  269. arctrl/py/Spreadsheet/assembly_info.py +1 -0
  270. arctrl/py/Spreadsheet/collection_aux.py +167 -0
  271. arctrl/py/Spreadsheet/data_map.py +44 -0
  272. arctrl/py/Spreadsheet/template.py +460 -0
  273. arctrl/py/ValidationPackages/__init__.py +0 -0
  274. arctrl/py/ValidationPackages/validation_package.py +82 -0
  275. arctrl/py/ValidationPackages/validation_packages_config.py +132 -0
  276. arctrl/py/WebRequest/__init__.py +0 -0
  277. arctrl/py/WebRequest/web_request.py +9 -0
  278. arctrl/py/WebRequest/web_request_py.py +135 -0
  279. arctrl/py/Yaml/__init__.py +0 -0
  280. arctrl/py/Yaml/decode.py +1 -0
  281. arctrl/py/Yaml/encode.py +10 -0
  282. arctrl/py/Yaml/validation_package.py +77 -0
  283. arctrl/py/Yaml/validation_packages_config.py +86 -0
  284. arctrl/py/__init__.py +0 -0
  285. arctrl/py/arc.py +1400 -0
  286. arctrl/py/column_index.py +280 -0
  287. arctrl/py/conversion.py +2184 -0
  288. arctrl/py/cross_async.py +76 -0
  289. arctrl/py/fable_modules/dynamic_obj/__init__.py +0 -0
  290. arctrl/py/fable_modules/dynamic_obj/dyn_obj.py +136 -0
  291. arctrl/py/fable_modules/dynamic_obj/dynamic_obj.py +415 -0
  292. arctrl/py/fable_modules/dynamic_obj/fable_js.py +1 -0
  293. arctrl/py/fable_modules/dynamic_obj/fable_py.py +288 -0
  294. arctrl/py/fable_modules/dynamic_obj/hash_codes.py +82 -0
  295. arctrl/py/fable_modules/dynamic_obj/property_helper.py +25 -0
  296. arctrl/py/fable_modules/dynamic_obj/reflection_utils.py +87 -0
  297. arctrl/py/fable_modules/fable_library/__init__.py +0 -0
  298. arctrl/py/fable_modules/fable_library/array_.py +1528 -0
  299. arctrl/py/fable_modules/fable_library/async_.py +377 -0
  300. arctrl/py/fable_modules/fable_library/async_builder.py +379 -0
  301. arctrl/py/fable_modules/fable_library/big_int.py +330 -0
  302. arctrl/py/fable_modules/fable_library/bit_converter.py +131 -0
  303. arctrl/py/fable_modules/fable_library/boolean.py +26 -0
  304. arctrl/py/fable_modules/fable_library/char.py +237 -0
  305. arctrl/py/fable_modules/fable_library/choice.py +212 -0
  306. arctrl/py/fable_modules/fable_library/date.py +779 -0
  307. arctrl/py/fable_modules/fable_library/date_offset.py +79 -0
  308. arctrl/py/fable_modules/fable_library/decimal_.py +190 -0
  309. arctrl/py/fable_modules/fable_library/diagnostics.py +54 -0
  310. arctrl/py/fable_modules/fable_library/double.py +87 -0
  311. arctrl/py/fable_modules/fable_library/encoding.py +41 -0
  312. arctrl/py/fable_modules/fable_library/event.py +206 -0
  313. arctrl/py/fable_modules/fable_library/file.py +107 -0
  314. arctrl/py/fable_modules/fable_library/fsharp_collections.py +52 -0
  315. arctrl/py/fable_modules/fable_library/fsharp_core.py +123 -0
  316. arctrl/py/fable_modules/fable_library/global_.py +63 -0
  317. arctrl/py/fable_modules/fable_library/guid.py +41 -0
  318. arctrl/py/fable_modules/fable_library/int32.py +73 -0
  319. arctrl/py/fable_modules/fable_library/list.py +1788 -0
  320. arctrl/py/fable_modules/fable_library/long.py +240 -0
  321. arctrl/py/fable_modules/fable_library/mailbox_processor.py +179 -0
  322. arctrl/py/fable_modules/fable_library/map.py +1854 -0
  323. arctrl/py/fable_modules/fable_library/map_util.py +148 -0
  324. arctrl/py/fable_modules/fable_library/mutable_map.py +397 -0
  325. arctrl/py/fable_modules/fable_library/mutable_set.py +279 -0
  326. arctrl/py/fable_modules/fable_library/native.py +45 -0
  327. arctrl/py/fable_modules/fable_library/numeric.py +46 -0
  328. arctrl/py/fable_modules/fable_library/observable.py +222 -0
  329. arctrl/py/fable_modules/fable_library/option.py +128 -0
  330. arctrl/py/fable_modules/fable_library/path.py +62 -0
  331. arctrl/py/fable_modules/fable_library/range.py +117 -0
  332. arctrl/py/fable_modules/fable_library/reflection.py +463 -0
  333. arctrl/py/fable_modules/fable_library/reg_exp.py +137 -0
  334. arctrl/py/fable_modules/fable_library/resize_array.py +31 -0
  335. arctrl/py/fable_modules/fable_library/result.py +212 -0
  336. arctrl/py/fable_modules/fable_library/seq.py +1979 -0
  337. arctrl/py/fable_modules/fable_library/seq2.py +221 -0
  338. arctrl/py/fable_modules/fable_library/set.py +2414 -0
  339. arctrl/py/fable_modules/fable_library/singleton_local_time_zone.py +36 -0
  340. arctrl/py/fable_modules/fable_library/string_.py +573 -0
  341. arctrl/py/fable_modules/fable_library/system_collections_generic.py +462 -0
  342. arctrl/py/fable_modules/fable_library/system_text.py +237 -0
  343. arctrl/py/fable_modules/fable_library/task.py +116 -0
  344. arctrl/py/fable_modules/fable_library/task_builder.py +122 -0
  345. arctrl/py/fable_modules/fable_library/thread.py +5 -0
  346. arctrl/py/fable_modules/fable_library/time_span.py +283 -0
  347. arctrl/py/fable_modules/fable_library/timer.py +24 -0
  348. arctrl/py/fable_modules/fable_library/types.py +401 -0
  349. arctrl/py/fable_modules/fable_library/uri.py +109 -0
  350. arctrl/py/fable_modules/fable_library/util.py +2735 -0
  351. arctrl/py/fable_modules/fable_openpyxl/__init__.py +0 -0
  352. arctrl/py/fable_modules/fable_openpyxl/openpyxl.py +362 -0
  353. arctrl/py/fable_modules/fable_python/cognite-sdk/__init__.py +0 -0
  354. arctrl/py/fable_modules/fable_python/cognite-sdk/cognite_sdk.py +22 -0
  355. arctrl/py/fable_modules/fable_python/flask/__init__.py +0 -0
  356. arctrl/py/fable_modules/fable_python/flask/flask.py +34 -0
  357. arctrl/py/fable_modules/fable_python/jupyter/__init__.py +0 -0
  358. arctrl/py/fable_modules/fable_python/jupyter/ipy_widgets.py +47 -0
  359. arctrl/py/fable_modules/fable_python/jupyter/ipython.py +13 -0
  360. arctrl/py/fable_modules/fable_python/stdlib/__init__.py +0 -0
  361. arctrl/py/fable_modules/fable_python/stdlib/ast.py +1 -0
  362. arctrl/py/fable_modules/fable_python/stdlib/asyncio/__init__.py +0 -0
  363. arctrl/py/fable_modules/fable_python/stdlib/asyncio/events.py +17 -0
  364. arctrl/py/fable_modules/fable_python/stdlib/asyncio/futures.py +52 -0
  365. arctrl/py/fable_modules/fable_python/stdlib/asyncio/tasks.py +38 -0
  366. arctrl/py/fable_modules/fable_python/stdlib/base64_.py +1 -0
  367. arctrl/py/fable_modules/fable_python/stdlib/builtins_.py +38 -0
  368. arctrl/py/fable_modules/fable_python/stdlib/html.py +1 -0
  369. arctrl/py/fable_modules/fable_python/stdlib/json.py +1 -0
  370. arctrl/py/fable_modules/fable_python/stdlib/math_.py +1 -0
  371. arctrl/py/fable_modules/fable_python/stdlib/os_.py +1 -0
  372. arctrl/py/fable_modules/fable_python/stdlib/queue_.py +1 -0
  373. arctrl/py/fable_modules/fable_python/stdlib/string_.py +1 -0
  374. arctrl/py/fable_modules/fable_python/stdlib/sys_.py +30 -0
  375. arctrl/py/fable_modules/fable_python/stdlib/time_.py +1 -0
  376. arctrl/py/fable_modules/fable_python/stdlib/tk_inter.py +1 -0
  377. arctrl/py/fable_modules/fs_spreadsheet/Cells/__init__.py +0 -0
  378. arctrl/py/fable_modules/fs_spreadsheet/Cells/fs_cell.py +338 -0
  379. arctrl/py/fable_modules/fs_spreadsheet/Cells/fs_cells_collection.py +469 -0
  380. arctrl/py/fable_modules/fs_spreadsheet/DSL/__init__.py +0 -0
  381. arctrl/py/fable_modules/fs_spreadsheet/DSL/cell_builder.py +214 -0
  382. arctrl/py/fable_modules/fs_spreadsheet/DSL/column_builder.py +139 -0
  383. arctrl/py/fable_modules/fs_spreadsheet/DSL/dsl.py +50 -0
  384. arctrl/py/fable_modules/fs_spreadsheet/DSL/expression.py +65 -0
  385. arctrl/py/fable_modules/fs_spreadsheet/DSL/operators.py +9 -0
  386. arctrl/py/fable_modules/fs_spreadsheet/DSL/row_builder.py +139 -0
  387. arctrl/py/fable_modules/fs_spreadsheet/DSL/sheet_builder.py +118 -0
  388. arctrl/py/fable_modules/fs_spreadsheet/DSL/table_builder.py +122 -0
  389. arctrl/py/fable_modules/fs_spreadsheet/DSL/transform.py +464 -0
  390. arctrl/py/fable_modules/fs_spreadsheet/DSL/types.py +314 -0
  391. arctrl/py/fable_modules/fs_spreadsheet/DSL/workbook_builder.py +106 -0
  392. arctrl/py/fable_modules/fs_spreadsheet/Json/__init__.py +0 -0
  393. arctrl/py/fable_modules/fs_spreadsheet/Json/cell.py +103 -0
  394. arctrl/py/fable_modules/fs_spreadsheet/Json/column.py +70 -0
  395. arctrl/py/fable_modules/fs_spreadsheet/Json/row.py +70 -0
  396. arctrl/py/fable_modules/fs_spreadsheet/Json/table.py +57 -0
  397. arctrl/py/fable_modules/fs_spreadsheet/Json/value.py +93 -0
  398. arctrl/py/fable_modules/fs_spreadsheet/Json/workbook.py +71 -0
  399. arctrl/py/fable_modules/fs_spreadsheet/Json/worksheet.py +217 -0
  400. arctrl/py/fable_modules/fs_spreadsheet/Ranges/__init__.py +0 -0
  401. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range.py +47 -0
  402. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_address.py +186 -0
  403. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_base.py +90 -0
  404. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_column.py +78 -0
  405. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_row.py +48 -0
  406. arctrl/py/fable_modules/fs_spreadsheet/Tables/__init__.py +0 -0
  407. arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table.py +393 -0
  408. arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table_field.py +127 -0
  409. arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table_row.py +23 -0
  410. arctrl/py/fable_modules/fs_spreadsheet/__init__.py +0 -0
  411. arctrl/py/fable_modules/fs_spreadsheet/fs_address.py +218 -0
  412. arctrl/py/fable_modules/fs_spreadsheet/fs_column.py +172 -0
  413. arctrl/py/fable_modules/fs_spreadsheet/fs_row.py +183 -0
  414. arctrl/py/fable_modules/fs_spreadsheet/fs_workbook.py +180 -0
  415. arctrl/py/fable_modules/fs_spreadsheet/fs_worksheet.py +600 -0
  416. arctrl/py/fable_modules/fs_spreadsheet/sheet_builder.py +330 -0
  417. arctrl/py/fable_modules/fs_spreadsheet_py/__init__.py +0 -0
  418. arctrl/py/fable_modules/fs_spreadsheet_py/cell.py +63 -0
  419. arctrl/py/fable_modules/fs_spreadsheet_py/cell_type.py +50 -0
  420. arctrl/py/fable_modules/fs_spreadsheet_py/fs_extension.py +60 -0
  421. arctrl/py/fable_modules/fs_spreadsheet_py/json.py +47 -0
  422. arctrl/py/fable_modules/fs_spreadsheet_py/table.py +53 -0
  423. arctrl/py/fable_modules/fs_spreadsheet_py/workbook.py +40 -0
  424. arctrl/py/fable_modules/fs_spreadsheet_py/worksheet.py +54 -0
  425. arctrl/py/fable_modules/fs_spreadsheet_py/xlsx.py +37 -0
  426. arctrl/py/fable_modules/thoth_json_core/__init__.py +0 -0
  427. arctrl/py/fable_modules/thoth_json_core/decode.py +1588 -0
  428. arctrl/py/fable_modules/thoth_json_core/encode.py +261 -0
  429. arctrl/py/fable_modules/thoth_json_core/types.py +181 -0
  430. arctrl/py/fable_modules/thoth_json_python/__init__.py +0 -0
  431. arctrl/py/fable_modules/thoth_json_python/decode.py +112 -0
  432. arctrl/py/fable_modules/thoth_json_python/encode.py +72 -0
  433. arctrl/py/fable_modules/thoth_json_python/python.py +1 -0
  434. arctrl/py/fable_modules/yamlicious/Interop/__init__.py +0 -0
  435. arctrl/py/fable_modules/yamlicious/Interop/js_interop.py +1 -0
  436. arctrl/py/fable_modules/yamlicious/Interop/py_interop.py +7 -0
  437. arctrl/py/fable_modules/yamlicious/__init__.py +0 -0
  438. arctrl/py/fable_modules/yamlicious/decode.py +1784 -0
  439. arctrl/py/fable_modules/yamlicious/encode.py +84 -0
  440. arctrl/py/fable_modules/yamlicious/library.py +10 -0
  441. arctrl/py/fable_modules/yamlicious/persil.py +57 -0
  442. arctrl/py/fable_modules/yamlicious/preprocessing.py +99 -0
  443. arctrl/py/fable_modules/yamlicious/reader.py +665 -0
  444. arctrl/py/fable_modules/yamlicious/regex.py +21 -0
  445. arctrl/py/fable_modules/yamlicious/regex_active_patterns.py +256 -0
  446. arctrl/py/fable_modules/yamlicious/writer.py +175 -0
  447. arctrl/py/fable_modules/yamlicious/yamlicious_types.py +128 -0
  448. arctrl/py/json.py +213 -0
  449. arctrl/py/rocrate_io.py +72 -0
  450. arctrl/py/template_web.py +23 -0
  451. arctrl/py/xlsx.py +148 -0
  452. arctrl/rocrate.py +21 -0
  453. arctrl-3.0.0a3.dist-info/LICENSE +21 -0
  454. arctrl-3.0.0a3.dist-info/METADATA +119 -0
  455. arctrl-3.0.0a3.dist-info/RECORD +456 -0
  456. arctrl-3.0.0a3.dist-info/WHEEL +4 -0
@@ -0,0 +1,79 @@
1
+ from __future__ import annotations
2
+
3
+ from datetime import datetime, timedelta, timezone
4
+
5
+ from . import time_span
6
+ from .time_span import TimeSpan
7
+ from .types import FSharpRef
8
+
9
+
10
+ def timedelta_total_microseconds(td: timedelta) -> int:
11
+ # timedelta doesn't expose total_microseconds
12
+ # so we need to calculate it ourselves
13
+ return td.days * (24 * 3600) + td.seconds * 10**6 + td.microseconds
14
+
15
+
16
+ def add(d: datetime, ts: timedelta) -> datetime:
17
+ return d + ts
18
+
19
+
20
+ def parse(string: str, detectUTC: bool = False) -> datetime:
21
+ from dateutil import parser
22
+
23
+ return parser.parse(string)
24
+
25
+
26
+ def try_parse(string: str, style: int, unsigned: bool, bitsize: int, defValue: FSharpRef[datetime]) -> bool:
27
+ try:
28
+ defValue.contents = parse(string)
29
+ return True
30
+ except Exception:
31
+ return False
32
+
33
+
34
+ def create(
35
+ year: int,
36
+ month: int,
37
+ day: int,
38
+ h: int,
39
+ m: int,
40
+ s: int,
41
+ ms: int | TimeSpan,
42
+ offset: TimeSpan | None = None,
43
+ ) -> datetime:
44
+ python_offset: timedelta | None = None
45
+ if isinstance(ms, TimeSpan):
46
+ python_offset = timedelta(microseconds=time_span.total_microseconds(ms))
47
+ ms = 0
48
+
49
+ if python_offset is None:
50
+ return datetime(year, month, day, h, m, s, ms)
51
+
52
+ tzinfo = timezone(python_offset)
53
+ return datetime(year, month, day, h, m, s, ms, tzinfo=tzinfo)
54
+
55
+
56
+ def now() -> datetime:
57
+ return datetime.now()
58
+
59
+
60
+ def utc_now() -> datetime:
61
+ return datetime.utcnow()
62
+
63
+
64
+ def op_addition(x: datetime, y: timedelta) -> datetime:
65
+ return x + y
66
+
67
+
68
+ def op_subtraction(x: datetime, y: datetime | TimeSpan) -> datetime | TimeSpan:
69
+ if isinstance(y, TimeSpan):
70
+ return x - timedelta(microseconds=time_span.total_microseconds(y))
71
+
72
+ return time_span.create(0, 0, 0, 0, 0, timedelta_total_microseconds(x - y))
73
+
74
+
75
+ def min_value() -> datetime:
76
+ return datetime.min
77
+
78
+
79
+ __all__ = ["now", "op_addition", "op_subtraction", "parse", "try_parse", "utc_now"]
@@ -0,0 +1,190 @@
1
+ from decimal import MAX_EMAX, MIN_EMIN, Decimal, getcontext
2
+
3
+ from .types import FSharpRef
4
+
5
+
6
+ getcontext().prec = 29
7
+
8
+ get_zero = Decimal(0)
9
+ get_one = Decimal(1)
10
+
11
+ get_minus_one = Decimal(-1)
12
+ get_max_value = MAX_EMAX
13
+ get_min_value = MIN_EMIN
14
+
15
+
16
+ def compare(x: Decimal, y: Decimal) -> int:
17
+ return -1 if x < y else 1 if x > y else 0
18
+
19
+
20
+ def equals(a: Decimal, b: Decimal) -> bool:
21
+ return a == b
22
+
23
+
24
+ def abs(x: Decimal) -> Decimal:
25
+ return -x if x < 0 else x
26
+
27
+
28
+ def sign(x: Decimal) -> int:
29
+ return -1 if x < 0 else 1 if x > 0 else 0
30
+
31
+
32
+ def max(x: Decimal, y: Decimal) -> Decimal:
33
+ return x if x > y else y
34
+
35
+
36
+ def min(x: Decimal, y: Decimal) -> Decimal:
37
+ return x if x < y else y
38
+
39
+
40
+ def add(a: Decimal, b: Decimal) -> Decimal:
41
+ return a + b
42
+
43
+
44
+ def subtract(a: Decimal, b: Decimal) -> Decimal:
45
+ return a - b
46
+
47
+
48
+ def multiply(a: Decimal, b: Decimal) -> Decimal:
49
+ return a * b
50
+
51
+
52
+ def divide(a: Decimal, b: Decimal) -> Decimal:
53
+ return a / b
54
+
55
+
56
+ def remainder(a: Decimal, b: Decimal) -> Decimal:
57
+ return a % b
58
+
59
+
60
+ def negate(a: Decimal) -> Decimal:
61
+ return -a
62
+
63
+
64
+ def op_unary_negation(a: Decimal) -> Decimal:
65
+ return -a
66
+
67
+
68
+ def op_unary_plus(a: Decimal) -> Decimal:
69
+ return +a
70
+
71
+
72
+ def op_addition(a: Decimal, b: Decimal) -> Decimal:
73
+ return a + b
74
+
75
+
76
+ def op_subtraction(a: Decimal, b: Decimal) -> Decimal:
77
+ return a - b
78
+
79
+
80
+ def op_multiply(a: Decimal, b: Decimal) -> Decimal:
81
+ return a * b
82
+
83
+
84
+ def op_division(a: Decimal, b: Decimal) -> Decimal:
85
+ return a / b
86
+
87
+
88
+ def op_modulus(a: Decimal, b: Decimal) -> Decimal:
89
+ return a % b
90
+
91
+
92
+ def op_less_than(a: Decimal, b: Decimal) -> bool:
93
+ return a < b
94
+
95
+
96
+ def op_less_than_or_equal(a: Decimal, b: Decimal) -> bool:
97
+ return a <= b
98
+
99
+
100
+ def op_greater_than(a: Decimal, b: Decimal) -> bool:
101
+ return a > b
102
+
103
+
104
+ def op_greater_than_or_equal(a: Decimal, b: Decimal) -> bool:
105
+ return a >= b
106
+
107
+
108
+ def op_equality(a: Decimal, b: Decimal) -> bool:
109
+ return a == b
110
+
111
+
112
+ def op_inequality(a: Decimal, b: Decimal) -> bool:
113
+ return a != b
114
+
115
+
116
+ def from_parts(low: int, mid: int, high: int, isNegative: bool, scale: int) -> Decimal:
117
+ sign = -1 if isNegative else 1
118
+
119
+ if low < 0:
120
+ low = 0x100000000 + low
121
+
122
+ if mid < 0:
123
+ mid = 0xFFFFFFFF00000000 + mid + 1
124
+ else:
125
+ mid = mid << 32
126
+
127
+ if high < 0:
128
+ high = 0xFFFFFFFF0000000000000000 + high + 1
129
+ else:
130
+ high = high << 64
131
+
132
+ value = Decimal((low + mid + high) * sign)
133
+ if scale:
134
+ dscale = Decimal(pow(10, scale))
135
+ return value / dscale
136
+ return value
137
+
138
+
139
+ def to_string(x: Decimal) -> str:
140
+ return str(x)
141
+
142
+
143
+ def to_number(x: Decimal) -> float:
144
+ return float(x)
145
+
146
+
147
+ def parse(string: str) -> Decimal:
148
+ return Decimal(string)
149
+
150
+
151
+ def try_parse(string: str, def_value: FSharpRef[Decimal]) -> bool:
152
+ try:
153
+ def_value.contents = parse(string)
154
+ return True
155
+ except Exception:
156
+ return False
157
+
158
+
159
+ __all__ = [
160
+ "compare",
161
+ "equals",
162
+ "abs",
163
+ "sign",
164
+ "max",
165
+ "min",
166
+ "add",
167
+ "subtract",
168
+ "multiply",
169
+ "divide",
170
+ "remainder",
171
+ "negate",
172
+ "op_unary_negation",
173
+ "op_unary_plus",
174
+ "op_addition",
175
+ "op_subtraction",
176
+ "op_multiply",
177
+ "op_division",
178
+ "op_modulus",
179
+ "op_less_than",
180
+ "op_less_than_or_equal",
181
+ "op_greater_than",
182
+ "op_greater_than_or_equal",
183
+ "op_equality",
184
+ "op_inequality",
185
+ "from_parts",
186
+ "to_string",
187
+ "to_number",
188
+ "try_parse",
189
+ "parse",
190
+ ]
@@ -0,0 +1,54 @@
1
+ from __future__ import annotations
2
+
3
+ import time
4
+
5
+
6
+ class TimerError(Exception):
7
+ """A custom exception used to report errors in use of Timer class"""
8
+
9
+
10
+ class StopWatch:
11
+ def __init__(self) -> None:
12
+ self._start_time: float | None = None
13
+ self._elapsed_time: float | None = None
14
+
15
+ def is_running(self) -> bool:
16
+ """Return True if timer is running"""
17
+ return self._start_time is not None
18
+
19
+ def start(self) -> None:
20
+ """Start a new timer"""
21
+ if self._start_time is not None:
22
+ raise TimerError("Timer is running. Use .stop() to stop it")
23
+
24
+ self._start_time = time.perf_counter()
25
+
26
+ def stop(self) -> None:
27
+ """Stop the timer, and report the elapsed time"""
28
+ if self._start_time is None:
29
+ raise TimerError("Timer is not running. Use .start() to start it")
30
+
31
+ self._elapsed_time = time.perf_counter() - self._start_time
32
+ self._start_time = None
33
+
34
+ def elapsed_milliseconds(self) -> int:
35
+ """Return the elapsed time in milliseconds"""
36
+ if self._elapsed_time is None:
37
+ raise TimerError("Timer is not running. Use .start() to start it")
38
+
39
+ return int(self._elapsed_time * 1000)
40
+
41
+ def elapsed_ticks(self) -> int:
42
+ """Return the elapsed time in ticks"""
43
+ if self._elapsed_time is None:
44
+ raise TimerError("Timer is not running. Use .start() to start it")
45
+
46
+ return int(self._elapsed_time * 10000000)
47
+
48
+
49
+ def frequency() -> int:
50
+ return 1000000000
51
+
52
+
53
+ def get_timestamp() -> int:
54
+ return time.perf_counter_ns()
@@ -0,0 +1,87 @@
1
+ import math
2
+ from math import copysign
3
+ from typing import Any
4
+
5
+ from .types import FSharpRef
6
+
7
+
8
+ def abs(x: float) -> float:
9
+ return -x if x < 0 else x
10
+
11
+
12
+ def sign(x: float) -> float:
13
+ return -1 if x < 0 else 1 if x > 0 else 0
14
+
15
+
16
+ def max(x: float, y: float) -> float:
17
+ return x if x > y else y
18
+
19
+
20
+ def min(x: float, y: float) -> float:
21
+ return x if x < y else y
22
+
23
+
24
+ def divide(x: float, y: float) -> float:
25
+ """Divide two numbers.
26
+
27
+ Returns nan if y is 0.
28
+ """
29
+ if y == 0:
30
+ if x == 0:
31
+ return float("nan")
32
+ return float("inf") if copysign(1, x) == copysign(1, y) else float("-inf")
33
+
34
+ return x / y
35
+
36
+
37
+ def log(x: float) -> float:
38
+ if x == 0:
39
+ return float("-inf")
40
+ elif x < 0:
41
+ return float("nan")
42
+ return math.log(x)
43
+
44
+
45
+ def sqrt(x: float) -> float:
46
+ try:
47
+ return math.sqrt(x)
48
+ except ValueError:
49
+ return float("nan")
50
+
51
+
52
+ def is_positive_inf(value: float) -> bool:
53
+ return math.isinf(value) and value > 0
54
+
55
+
56
+ def is_negative_inf(value: float) -> bool:
57
+ return math.isinf(value) and value < 0
58
+
59
+
60
+ def parse(value: Any) -> float:
61
+ try:
62
+ return float(value)
63
+ except Exception:
64
+ raise ValueError(f"The input string {value} was not in a correct format.")
65
+
66
+
67
+ def try_parse(string: str, def_value: FSharpRef[float]) -> bool:
68
+ try:
69
+ def_value.contents = parse(string)
70
+ return True
71
+ except Exception:
72
+ return False
73
+
74
+
75
+ __all__ = [
76
+ "abs",
77
+ "sign",
78
+ "max",
79
+ "min",
80
+ "parse",
81
+ "try_parse",
82
+ "divide",
83
+ "log",
84
+ "sqrt",
85
+ "is_negative_inf",
86
+ "is_positive_inf",
87
+ ]
@@ -0,0 +1,41 @@
1
+ from __future__ import annotations
2
+
3
+
4
+ class UTF16LE:
5
+ def get_bytes(self, string: str, index: int | None = None, count: int | None = None) -> bytes:
6
+ return string.encode("utf-16le")
7
+
8
+ def get_string(self, bytes: bytes, index: int | None = None, count: int | None = None) -> str:
9
+ if index is None:
10
+ return bytes.decode("utf-8")
11
+ else:
12
+ return bytes.decode("utf-8")[index:count]
13
+
14
+
15
+ class UTF8:
16
+ def get_bytes(self, string: str, index: int | None = None, count: int | None = None) -> bytes:
17
+ if index is None:
18
+ return string.encode("utf-8")
19
+ else:
20
+ return string.encode("utf-8")[index:count]
21
+
22
+ def get_string(self, bytes: bytes, index: int | None = None, count: int | None = None) -> str:
23
+ if index is None:
24
+ return bytes.decode("utf-8")
25
+ else:
26
+ return bytes.decode("utf-8")[index:count]
27
+
28
+
29
+ _UTF8 = UTF8()
30
+ _UTF16 = UTF16LE()
31
+
32
+
33
+ def get_unicode():
34
+ return _UTF16
35
+
36
+
37
+ def get_utf8() -> UTF8:
38
+ return _UTF8
39
+
40
+
41
+ __all__ = ["UTF8", "UTF16LE", "get_utf8", "get_unicode"]
@@ -0,0 +1,206 @@
1
+ import inspect
2
+ from abc import abstractmethod
3
+ from collections.abc import Callable
4
+ from typing import (
5
+ Any,
6
+ Generic,
7
+ Protocol,
8
+ TypeVar,
9
+ overload,
10
+ )
11
+
12
+ from .choice import (
13
+ Choice_tryValueIfChoice1Of2,
14
+ Choice_tryValueIfChoice2Of2,
15
+ FSharpChoice_2,
16
+ )
17
+ from .observable import IObservable, IObserver, Observer
18
+ from .option import some, value
19
+ from .util import IDisposable
20
+
21
+
22
+ _T = TypeVar("_T")
23
+ _U = TypeVar("_U")
24
+ _V = TypeVar("_V")
25
+ _Args = TypeVar("_Args", covariant=True)
26
+ _Delegate = TypeVar("_Delegate", covariant=True)
27
+ _T_co = TypeVar("_T_co", covariant=True)
28
+
29
+ Delegate = Callable[[_T], None]
30
+ DotNetDelegate = Callable[[Any, _T], None]
31
+ EventDelegate = Delegate[_T] | DotNetDelegate[_T]
32
+
33
+
34
+ class IDelegateEvent(Generic[_T_co], Protocol):
35
+ @abstractmethod
36
+ def AddHandler(self, d: DotNetDelegate[_T]) -> None: ...
37
+
38
+ @abstractmethod
39
+ def RemoveHandler(self, d: DotNetDelegate[_T]) -> None: ...
40
+
41
+
42
+ class IEvent_2(IObservable[_Args], IDelegateEvent[_Delegate], Protocol): ...
43
+
44
+
45
+ IEvent = IEvent_2[_T, _T]
46
+
47
+
48
+ class Event(IEvent[_T]):
49
+ def __init__(self) -> None:
50
+ self.delegates: list[EventDelegate[_T]] = []
51
+
52
+ def Add(self, f: Delegate[_T]) -> None:
53
+ self._addHandler(f)
54
+
55
+ @property
56
+ def Publish(self) -> IEvent[_T]:
57
+ return self
58
+
59
+ @overload
60
+ def Trigger(self, value: _T) -> None: ...
61
+
62
+ @overload
63
+ def Trigger(self, sender: Any, value: _T) -> None: ...
64
+
65
+ def Trigger(self, sender_or_value: Any, value_or_undefined: _T | None = None) -> None:
66
+ if value_or_undefined is None:
67
+ value = sender_or_value
68
+ sender = None
69
+ else:
70
+ sender = sender_or_value
71
+ value = value_or_undefined
72
+
73
+ for f in self.delegates:
74
+ if len(inspect.signature(f).parameters) == 1:
75
+ f(value)
76
+ else:
77
+ f(sender, value)
78
+
79
+ # IDelegateEvent<T> methods
80
+
81
+ def AddHandler(self, handler: DotNetDelegate[_T]) -> None:
82
+ self._addHandler(handler)
83
+
84
+ def RemoveHandler(self, handler: DotNetDelegate[_T]) -> None:
85
+ self._removeHandler(handler)
86
+
87
+ # IObservable<T> methods
88
+
89
+ def Subscribe(self, __obs: IObserver[_T] | Delegate[_T]) -> IDisposable:
90
+ if callable(__obs):
91
+ callback = __obs
92
+ else:
93
+ callback = __obs.OnNext
94
+
95
+ self._addHandler(callback)
96
+
97
+ def dispose() -> None:
98
+ self._removeHandler(callback)
99
+
100
+ return IDisposable.create(dispose)
101
+
102
+ def _addHandler(self, f: Delegate[_T]) -> None:
103
+ self.delegates.append(f)
104
+
105
+ def _removeHandler(self, f: EventDelegate[_T]) -> None:
106
+ if f in self.delegates:
107
+ self.delegates.remove(f)
108
+
109
+
110
+ def add(callback: Delegate[_T], source_event: IEvent[_T]) -> None:
111
+ if isinstance(source_event, Event):
112
+ source_event.Add(callback)
113
+ else:
114
+ source_event.Subscribe(Observer(callback))
115
+
116
+
117
+ def choose(chooser: Callable[[_T], _U | None], source_event: IEvent[_T]) -> IEvent[_U]:
118
+ ev = Event[_U]()
119
+
120
+ def callback(t):
121
+ u = chooser(t)
122
+ if u is not None:
123
+ ev.Trigger(value(u))
124
+
125
+ add(callback, source_event)
126
+ return ev
127
+
128
+
129
+ def filter(predicate: Callable[[_T], bool], source_event: IEvent[_T]) -> IEvent[_T]:
130
+ return choose(lambda t: some(t) if predicate(t) else None, source_event)
131
+
132
+
133
+ def map(mapping: Callable[[_T], _U], source_event: IEvent[_T]) -> IEvent[_U]:
134
+ return choose(lambda t: mapping(t), source_event)
135
+
136
+
137
+ def merge(event1: IEvent[_T], event2: IEvent[_T]) -> IEvent[_T]:
138
+ ev = Event[_T]()
139
+
140
+ def fn(t):
141
+ ev.Trigger(t)
142
+
143
+ add(fn, event1)
144
+ add(fn, event2)
145
+ return ev
146
+
147
+
148
+ def pairwise(source_event: IEvent[_T]) -> IEvent[list[_T]]:
149
+ ev = Event[list[_T]]()
150
+ last = None
151
+
152
+ def fn(next):
153
+ nonlocal last
154
+ if last is not None:
155
+ ev.Trigger([last, next])
156
+ last = next
157
+
158
+ add(fn, source_event)
159
+ return ev
160
+
161
+
162
+ def partition(predicate: Callable[[_T], bool], source_event: IEvent[_T]) -> list[IEvent[_T]]:
163
+ return [
164
+ filter(predicate, source_event),
165
+ filter(lambda x: not predicate(x), source_event),
166
+ ]
167
+
168
+
169
+ def scan(
170
+ collector: Callable[[_U, _T], _U],
171
+ state: _U,
172
+ source_event: IEvent[_T],
173
+ ) -> IEvent[_U]:
174
+ return map(lambda t: collector(state, t), source_event)
175
+
176
+
177
+ def split(splitter: Callable[[_T], FSharpChoice_2[_U, _V]], source_event: IEvent[_T]) -> list[IEvent[_U | _V]]:
178
+ return [
179
+ choose(lambda t: Choice_tryValueIfChoice1Of2(splitter(t)), source_event),
180
+ choose(lambda t: Choice_tryValueIfChoice2Of2(splitter(t)), source_event),
181
+ ]
182
+
183
+
184
+ def create_event(
185
+ add_handler: Callable[[DotNetDelegate[_T]], None],
186
+ remove_handler: Callable[[DotNetDelegate[_T]], None],
187
+ ) -> IEvent[_T]:
188
+ class AnonymousEvent(IEvent[_U]):
189
+ def AddHandler(self, handler: DotNetDelegate[_T]) -> None:
190
+ add_handler(handler)
191
+
192
+ def RemoveHandler(self, handler: DotNetDelegate[_T]) -> None:
193
+ remove_handler(handler)
194
+
195
+ def Subscribe(self, observer: IObserver[_T]) -> IDisposable:
196
+ def h(sender, value):
197
+ observer.OnNext(value)
198
+
199
+ add_handler(h)
200
+
201
+ def dispose() -> None:
202
+ remove_handler(h)
203
+
204
+ return IDisposable.create(dispose)
205
+
206
+ return AnonymousEvent[_T]()