jade-lang 0.1.0

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 (326) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +23 -0
  3. data/LICENSE +21 -0
  4. data/README.md +386 -0
  5. data/exe/jade +6 -0
  6. data/lib/jade/ast/node.rb +44 -0
  7. data/lib/jade/ast/nodes.rb +35 -0
  8. data/lib/jade/ast/pretty_printer.rb +50 -0
  9. data/lib/jade/ast.rb +723 -0
  10. data/lib/jade/calendar/runtime.rb +15 -0
  11. data/lib/jade/cli/fmt.rb +96 -0
  12. data/lib/jade/cli/lsp.rb +13 -0
  13. data/lib/jade/cli/q.rb +113 -0
  14. data/lib/jade/cli.rb +43 -0
  15. data/lib/jade/clock/runtime.rb +13 -0
  16. data/lib/jade/codegen/boundary/cache.rb +94 -0
  17. data/lib/jade/codegen/boundary/specialized/list.rb +65 -0
  18. data/lib/jade/codegen/boundary/specialized/maybe.rb +40 -0
  19. data/lib/jade/codegen/boundary/specialized/record.rb +165 -0
  20. data/lib/jade/codegen/boundary/specialized/scalar.rb +67 -0
  21. data/lib/jade/codegen/boundary/specialized.rb +106 -0
  22. data/lib/jade/codegen/boundary.rb +189 -0
  23. data/lib/jade/codegen/constructor_reference.rb +18 -0
  24. data/lib/jade/codegen/context.rb +96 -0
  25. data/lib/jade/codegen/emitter.rb +81 -0
  26. data/lib/jade/codegen/function_call.rb +367 -0
  27. data/lib/jade/codegen/function_declaration.rb +199 -0
  28. data/lib/jade/codegen/helpers.rb +103 -0
  29. data/lib/jade/codegen/implementation.rb +178 -0
  30. data/lib/jade/codegen/inline.rb +89 -0
  31. data/lib/jade/codegen/inlines.rb +326 -0
  32. data/lib/jade/codegen/method_names.rb +54 -0
  33. data/lib/jade/codegen/pattern/constructor.rb +57 -0
  34. data/lib/jade/codegen/port_decoder.rb +77 -0
  35. data/lib/jade/codegen/pretty.rb +53 -0
  36. data/lib/jade/codegen/transforms/fold_shape.rb +222 -0
  37. data/lib/jade/codegen/transforms/self_call.rb +80 -0
  38. data/lib/jade/codegen/transforms/tail_call.rb +120 -0
  39. data/lib/jade/codegen/variant_declaration.rb +41 -0
  40. data/lib/jade/codegen.rb +400 -0
  41. data/lib/jade/compiler.rb +69 -0
  42. data/lib/jade/decode.rb +320 -0
  43. data/lib/jade/diagnostics/renderer.rb +121 -0
  44. data/lib/jade/diagnostics.rb +77 -0
  45. data/lib/jade/did_you_mean.rb +16 -0
  46. data/lib/jade/entry.rb +177 -0
  47. data/lib/jade/error.rb +72 -0
  48. data/lib/jade/formatter/accesses.rb +37 -0
  49. data/lib/jade/formatter/bindings.rb +29 -0
  50. data/lib/jade/formatter/body.rb +50 -0
  51. data/lib/jade/formatter/calls.rb +51 -0
  52. data/lib/jade/formatter/case_of.rb +31 -0
  53. data/lib/jade/formatter/case_of_branch.rb +59 -0
  54. data/lib/jade/formatter/collections.rb +78 -0
  55. data/lib/jade/formatter/declarations.rb +178 -0
  56. data/lib/jade/formatter/exposing.rb +48 -0
  57. data/lib/jade/formatter/function_declaration.rb +72 -0
  58. data/lib/jade/formatter/helper.rb +122 -0
  59. data/lib/jade/formatter/if_then_else.rb +64 -0
  60. data/lib/jade/formatter/infix_application.rb +69 -0
  61. data/lib/jade/formatter/lambda.rb +50 -0
  62. data/lib/jade/formatter/leaves.rb +111 -0
  63. data/lib/jade/formatter/module_node.rb +26 -0
  64. data/lib/jade/formatter/pattern.rb +61 -0
  65. data/lib/jade/formatter/type.rb +67 -0
  66. data/lib/jade/formatter.rb +38 -0
  67. data/lib/jade/frontend/comment_attacher.rb +121 -0
  68. data/lib/jade/frontend/desugaring/placeholder.rb +39 -0
  69. data/lib/jade/frontend/desugaring/resolved.rb +63 -0
  70. data/lib/jade/frontend/desugaring.rb +217 -0
  71. data/lib/jade/frontend/fixity_fixer.rb +209 -0
  72. data/lib/jade/frontend/forward_declaration/body.rb +30 -0
  73. data/lib/jade/frontend/forward_declaration/error/bad_import.rb +19 -0
  74. data/lib/jade/frontend/forward_declaration/error/exposed_type_not_found.rb +18 -0
  75. data/lib/jade/frontend/forward_declaration/error/exposed_value_not_found.rb +18 -0
  76. data/lib/jade/frontend/forward_declaration/error/module_not_found.rb +18 -0
  77. data/lib/jade/frontend/forward_declaration/error/private_type_expansion.rb +19 -0
  78. data/lib/jade/frontend/forward_declaration/error/tuple_arity_overflow.rb +25 -0
  79. data/lib/jade/frontend/forward_declaration/error/type_not_found.rb +29 -0
  80. data/lib/jade/frontend/forward_declaration/error/type_not_lowerable.rb +16 -0
  81. data/lib/jade/frontend/forward_declaration/error/unknown_extends_interface.rb +18 -0
  82. data/lib/jade/frontend/forward_declaration/error.rb +11 -0
  83. data/lib/jade/frontend/forward_declaration/function_declaration.rb +32 -0
  84. data/lib/jade/frontend/forward_declaration/helper.rb +91 -0
  85. data/lib/jade/frontend/forward_declaration/implementation.rb +63 -0
  86. data/lib/jade/frontend/forward_declaration/implementation_function.rb +39 -0
  87. data/lib/jade/frontend/forward_declaration/import_declaration.rb +115 -0
  88. data/lib/jade/frontend/forward_declaration/interface_declaration.rb +66 -0
  89. data/lib/jade/frontend/forward_declaration/interop_import_declaration.rb +99 -0
  90. data/lib/jade/frontend/forward_declaration/module.rb +98 -0
  91. data/lib/jade/frontend/forward_declaration/struct_declaration.rb +42 -0
  92. data/lib/jade/frontend/forward_declaration/type_declaration.rb +42 -0
  93. data/lib/jade/frontend/forward_declaration.rb +71 -0
  94. data/lib/jade/frontend/pattern_analysis/exhaustiveness.rb +65 -0
  95. data/lib/jade/frontend/pattern_analysis/matrix.rb +235 -0
  96. data/lib/jade/frontend/pattern_analysis.rb +40 -0
  97. data/lib/jade/frontend/semantic_analysis/assign.rb +20 -0
  98. data/lib/jade/frontend/semantic_analysis/body.rb +33 -0
  99. data/lib/jade/frontend/semantic_analysis/case_of.rb +19 -0
  100. data/lib/jade/frontend/semantic_analysis/case_of_branch.rb +20 -0
  101. data/lib/jade/frontend/semantic_analysis/char_literal.rb +14 -0
  102. data/lib/jade/frontend/semantic_analysis/constructor_reference.rb +64 -0
  103. data/lib/jade/frontend/semantic_analysis/error/circular_extends.rb +19 -0
  104. data/lib/jade/frontend/semantic_analysis/error/constant_not_callable.rb +24 -0
  105. data/lib/jade/frontend/semantic_analysis/error/constructor_not_found.rb +34 -0
  106. data/lib/jade/frontend/semantic_analysis/error/constructor_pattern_arity_mismatch.rb +24 -0
  107. data/lib/jade/frontend/semantic_analysis/error/duplicate_field.rb +18 -0
  108. data/lib/jade/frontend/semantic_analysis/error/duplicate_function_declaration.rb +25 -0
  109. data/lib/jade/frontend/semantic_analysis/error/duplicate_record_field.rb +19 -0
  110. data/lib/jade/frontend/semantic_analysis/error/invalid_list_rest_pattern.rb +21 -0
  111. data/lib/jade/frontend/semantic_analysis/error/kwargs_on_non_constructor.rb +17 -0
  112. data/lib/jade/frontend/semantic_analysis/error/missing_exposing_clause.rb +17 -0
  113. data/lib/jade/frontend/semantic_analysis/error/missing_extends_implementation.rb +21 -0
  114. data/lib/jade/frontend/semantic_analysis/error/missing_field.rb +20 -0
  115. data/lib/jade/frontend/semantic_analysis/error/missing_implementation_function.rb +19 -0
  116. data/lib/jade/frontend/semantic_analysis/error/module_not_found.rb +22 -0
  117. data/lib/jade/frontend/semantic_analysis/error/nested_task_port.rb +19 -0
  118. data/lib/jade/frontend/semantic_analysis/error/non_task_port.rb +22 -0
  119. data/lib/jade/frontend/semantic_analysis/error/orphan_implementation.rb +20 -0
  120. data/lib/jade/frontend/semantic_analysis/error/predicate_must_return_bool.rb +22 -0
  121. data/lib/jade/frontend/semantic_analysis/error/predicate_name_not_allowed.rb +25 -0
  122. data/lib/jade/frontend/semantic_analysis/error/shadowing_error.rb +22 -0
  123. data/lib/jade/frontend/semantic_analysis/error/type_args_mismatch.rb +25 -0
  124. data/lib/jade/frontend/semantic_analysis/error/type_param_required.rb +19 -0
  125. data/lib/jade/frontend/semantic_analysis/error/unbound_type_variable.rb +22 -0
  126. data/lib/jade/frontend/semantic_analysis/error/undefined_variable.rb +29 -0
  127. data/lib/jade/frontend/semantic_analysis/error/unknown_field.rb +20 -0
  128. data/lib/jade/frontend/semantic_analysis/error/unknown_implementation_function.rb +19 -0
  129. data/lib/jade/frontend/semantic_analysis/error/unused_interface_type_param.rb +24 -0
  130. data/lib/jade/frontend/semantic_analysis/error/value_not_exposed.rb +23 -0
  131. data/lib/jade/frontend/semantic_analysis/error/variable_not_found.rb +25 -0
  132. data/lib/jade/frontend/semantic_analysis/error.rb +40 -0
  133. data/lib/jade/frontend/semantic_analysis/function_call.rb +60 -0
  134. data/lib/jade/frontend/semantic_analysis/function_declaration.rb +58 -0
  135. data/lib/jade/frontend/semantic_analysis/grouping.rb +17 -0
  136. data/lib/jade/frontend/semantic_analysis/helper.rb +152 -0
  137. data/lib/jade/frontend/semantic_analysis/if_then_else.rb +20 -0
  138. data/lib/jade/frontend/semantic_analysis/implementation.rb +143 -0
  139. data/lib/jade/frontend/semantic_analysis/implementation_function.rb +16 -0
  140. data/lib/jade/frontend/semantic_analysis/import_declaration.rb +14 -0
  141. data/lib/jade/frontend/semantic_analysis/interface_declaration.rb +45 -0
  142. data/lib/jade/frontend/semantic_analysis/interop_import_declaration.rb +69 -0
  143. data/lib/jade/frontend/semantic_analysis/keyed_call/validation.rb +109 -0
  144. data/lib/jade/frontend/semantic_analysis/keyed_call.rb +88 -0
  145. data/lib/jade/frontend/semantic_analysis/lambda.rb +23 -0
  146. data/lib/jade/frontend/semantic_analysis/list.rb +17 -0
  147. data/lib/jade/frontend/semantic_analysis/literal.rb +23 -0
  148. data/lib/jade/frontend/semantic_analysis/member_access.rb +87 -0
  149. data/lib/jade/frontend/semantic_analysis/module_node.rb +27 -0
  150. data/lib/jade/frontend/semantic_analysis/pattern_binding.rb +27 -0
  151. data/lib/jade/frontend/semantic_analysis/pattern_constructor.rb +47 -0
  152. data/lib/jade/frontend/semantic_analysis/pattern_list.rb +33 -0
  153. data/lib/jade/frontend/semantic_analysis/pattern_literal.rb +17 -0
  154. data/lib/jade/frontend/semantic_analysis/pattern_record.rb +25 -0
  155. data/lib/jade/frontend/semantic_analysis/pattern_wildcard.rb +14 -0
  156. data/lib/jade/frontend/semantic_analysis/qualified_access.rb +14 -0
  157. data/lib/jade/frontend/semantic_analysis/record_access.rb +14 -0
  158. data/lib/jade/frontend/semantic_analysis/record_field.rb +17 -0
  159. data/lib/jade/frontend/semantic_analysis/record_literal.rb +21 -0
  160. data/lib/jade/frontend/semantic_analysis/record_update.rb +21 -0
  161. data/lib/jade/frontend/semantic_analysis/struct_declaration.rb +44 -0
  162. data/lib/jade/frontend/semantic_analysis/tuple.rb +17 -0
  163. data/lib/jade/frontend/semantic_analysis/type_declaration.rb +69 -0
  164. data/lib/jade/frontend/semantic_analysis/variable_reference.rb +27 -0
  165. data/lib/jade/frontend/semantic_analysis/variant_declaration.rb +18 -0
  166. data/lib/jade/frontend/semantic_analysis.rb +161 -0
  167. data/lib/jade/frontend/type_checking/canonicalize.rb +97 -0
  168. data/lib/jade/frontend/type_checking/constraints/deriving/decodable.rb +144 -0
  169. data/lib/jade/frontend/type_checking/constraints/deriving/encodable.rb +144 -0
  170. data/lib/jade/frontend/type_checking/constraints/deriving/eq.rb +265 -0
  171. data/lib/jade/frontend/type_checking/constraints/deriving/helpers.rb +59 -0
  172. data/lib/jade/frontend/type_checking/constraints/deriving.rb +28 -0
  173. data/lib/jade/frontend/type_checking/constraints.rb +101 -0
  174. data/lib/jade/frontend/type_checking/definition.rb +71 -0
  175. data/lib/jade/frontend/type_checking/env.rb +79 -0
  176. data/lib/jade/frontend/type_checking/error/case_of_branches_type_mismatch.rb +19 -0
  177. data/lib/jade/frontend/type_checking/error/derivation_failed.rb +21 -0
  178. data/lib/jade/frontend/type_checking/error/function_body_type_mismatch.rb +23 -0
  179. data/lib/jade/frontend/type_checking/error/function_call_type_mismatch.rb +37 -0
  180. data/lib/jade/frontend/type_checking/error/if_branch_type_mismatch.rb +19 -0
  181. data/lib/jade/frontend/type_checking/error/if_branches_type_mismatch.rb +18 -0
  182. data/lib/jade/frontend/type_checking/error/if_condition_type_mismatch.rb +17 -0
  183. data/lib/jade/frontend/type_checking/error/implementation_type_mismatch.rb +20 -0
  184. data/lib/jade/frontend/type_checking/error/list_item_type_mismatch.rb +19 -0
  185. data/lib/jade/frontend/type_checking/error/missing_implementation.rb +20 -0
  186. data/lib/jade/frontend/type_checking/error/missing_patterns.rb +26 -0
  187. data/lib/jade/frontend/type_checking/error/pattern_type_mismatch.rb +13 -0
  188. data/lib/jade/frontend/type_checking/error/port_not_decodable.rb +38 -0
  189. data/lib/jade/frontend/type_checking/error/record_access_type_mismatch.rb +14 -0
  190. data/lib/jade/frontend/type_checking/error/type_mismatch.rb +23 -0
  191. data/lib/jade/frontend/type_checking/error/unresolved_constraint.rb +20 -0
  192. data/lib/jade/frontend/type_checking/error.rb +18 -0
  193. data/lib/jade/frontend/type_checking/expected.rb +23 -0
  194. data/lib/jade/frontend/type_checking/generalization.rb +17 -0
  195. data/lib/jade/frontend/type_checking/generalizer.rb +38 -0
  196. data/lib/jade/frontend/type_checking/inference/assign.rb +58 -0
  197. data/lib/jade/frontend/type_checking/inference/body.rb +45 -0
  198. data/lib/jade/frontend/type_checking/inference/case_of.rb +102 -0
  199. data/lib/jade/frontend/type_checking/inference/constructor_reference.rb +21 -0
  200. data/lib/jade/frontend/type_checking/inference/function_call.rb +132 -0
  201. data/lib/jade/frontend/type_checking/inference/function_declaration.rb +70 -0
  202. data/lib/jade/frontend/type_checking/inference/grouping.rb +18 -0
  203. data/lib/jade/frontend/type_checking/inference/helpers.rb +34 -0
  204. data/lib/jade/frontend/type_checking/inference/if_then_else.rb +46 -0
  205. data/lib/jade/frontend/type_checking/inference/implementation.rb +150 -0
  206. data/lib/jade/frontend/type_checking/inference/import_declaration.rb +19 -0
  207. data/lib/jade/frontend/type_checking/inference/interface_declaration.rb +18 -0
  208. data/lib/jade/frontend/type_checking/inference/interop_import_declaration.rb +18 -0
  209. data/lib/jade/frontend/type_checking/inference/lambda.rb +87 -0
  210. data/lib/jade/frontend/type_checking/inference/list.rb +52 -0
  211. data/lib/jade/frontend/type_checking/inference/literal.rb +24 -0
  212. data/lib/jade/frontend/type_checking/inference/module.rb +18 -0
  213. data/lib/jade/frontend/type_checking/inference/pattern.rb +135 -0
  214. data/lib/jade/frontend/type_checking/inference/qualified_access.rb +23 -0
  215. data/lib/jade/frontend/type_checking/inference/record_access.rb +35 -0
  216. data/lib/jade/frontend/type_checking/inference/record_field.rb +19 -0
  217. data/lib/jade/frontend/type_checking/inference/record_literal.rb +24 -0
  218. data/lib/jade/frontend/type_checking/inference/record_update.rb +37 -0
  219. data/lib/jade/frontend/type_checking/inference/struct_declaration.rb +18 -0
  220. data/lib/jade/frontend/type_checking/inference/type_declaration.rb +18 -0
  221. data/lib/jade/frontend/type_checking/inference/variable_reference.rb +27 -0
  222. data/lib/jade/frontend/type_checking/inference.rb +27 -0
  223. data/lib/jade/frontend/type_checking/instantiation.rb +24 -0
  224. data/lib/jade/frontend/type_checking/loader.rb +80 -0
  225. data/lib/jade/frontend/type_checking/placeholder.rb +12 -0
  226. data/lib/jade/frontend/type_checking/port_resolution.rb +123 -0
  227. data/lib/jade/frontend/type_checking/result.rb +41 -0
  228. data/lib/jade/frontend/type_checking/scheme.rb +20 -0
  229. data/lib/jade/frontend/type_checking/state.rb +52 -0
  230. data/lib/jade/frontend/type_checking/substitution.rb +93 -0
  231. data/lib/jade/frontend/type_checking/unification.rb +282 -0
  232. data/lib/jade/frontend/type_checking/var_gen.rb +33 -0
  233. data/lib/jade/frontend/type_checking.rb +129 -0
  234. data/lib/jade/frontend/unused_analysis.rb +41 -0
  235. data/lib/jade/frontend/usage_analysis/reference_index.rb +53 -0
  236. data/lib/jade/frontend/usage_analysis.rb +195 -0
  237. data/lib/jade/frontend.rb +101 -0
  238. data/lib/jade/interop/boundary.rb +68 -0
  239. data/lib/jade/interop/error.rb +84 -0
  240. data/lib/jade/interop/lowering/error.rb +32 -0
  241. data/lib/jade/interop/lowering.rb +53 -0
  242. data/lib/jade/interop/runtime.rb +24 -0
  243. data/lib/jade/interop.rb +1 -0
  244. data/lib/jade/lexer.rb +189 -0
  245. data/lib/jade/lsp/converters.rb +542 -0
  246. data/lib/jade/lsp/handlers.rb +340 -0
  247. data/lib/jade/lsp/server.rb +63 -0
  248. data/lib/jade/lsp/snippets.rb +100 -0
  249. data/lib/jade/lsp/state.rb +25 -0
  250. data/lib/jade/lsp.rb +16 -0
  251. data/lib/jade/module_loader/cache.rb +56 -0
  252. data/lib/jade/module_loader/dependency_graph.rb +23 -0
  253. data/lib/jade/module_loader/dependency_resolver.rb +48 -0
  254. data/lib/jade/module_loader/normalize.rb +34 -0
  255. data/lib/jade/module_loader/topological_sort.rb +41 -0
  256. data/lib/jade/module_loader.rb +127 -0
  257. data/lib/jade/parsing/combinators.rb +291 -0
  258. data/lib/jade/parsing/error.rb +154 -0
  259. data/lib/jade/parsing/token.rb +12 -0
  260. data/lib/jade/parsing/type.rb +92 -0
  261. data/lib/jade/parsing.rb +674 -0
  262. data/lib/jade/port.rb +1 -0
  263. data/lib/jade/registry.rb +79 -0
  264. data/lib/jade/result.rb +121 -0
  265. data/lib/jade/runtime.rb +127 -0
  266. data/lib/jade/source.rb +62 -0
  267. data/lib/jade/stdlib/basics.rb +214 -0
  268. data/lib/jade/stdlib/bytes.rb +70 -0
  269. data/lib/jade/stdlib/calendar.rb +405 -0
  270. data/lib/jade/stdlib/char.rb +27 -0
  271. data/lib/jade/stdlib/clock.rb +342 -0
  272. data/lib/jade/stdlib/compiled.rb +48 -0
  273. data/lib/jade/stdlib/decode/params.rb +154 -0
  274. data/lib/jade/stdlib/decode.rb +315 -0
  275. data/lib/jade/stdlib/dict.rb +134 -0
  276. data/lib/jade/stdlib/encode.rb +143 -0
  277. data/lib/jade/stdlib/intrinsics.rb +280 -0
  278. data/lib/jade/stdlib/list.rb +214 -0
  279. data/lib/jade/stdlib/maybe.rb +73 -0
  280. data/lib/jade/stdlib/result.rb +131 -0
  281. data/lib/jade/stdlib/set.rb +123 -0
  282. data/lib/jade/stdlib/string.rb +65 -0
  283. data/lib/jade/stdlib/task.rb +55 -0
  284. data/lib/jade/stdlib/tuple.rb +21 -0
  285. data/lib/jade/stdlib.rb +112 -0
  286. data/lib/jade/symbol/anonymous_record.rb +7 -0
  287. data/lib/jade/symbol/base.rb +15 -0
  288. data/lib/jade/symbol/constructor.rb +11 -0
  289. data/lib/jade/symbol/derived_function.rb +5 -0
  290. data/lib/jade/symbol/function.rb +15 -0
  291. data/lib/jade/symbol/function_type.rb +7 -0
  292. data/lib/jade/symbol/implementation.rb +17 -0
  293. data/lib/jade/symbol/implementation_template.rb +13 -0
  294. data/lib/jade/symbol/interface.rb +11 -0
  295. data/lib/jade/symbol/interface_function.rb +18 -0
  296. data/lib/jade/symbol/interop_function.rb +22 -0
  297. data/lib/jade/symbol/lambda.rb +7 -0
  298. data/lib/jade/symbol/parser.rb +79 -0
  299. data/lib/jade/symbol/partial_application.rb +7 -0
  300. data/lib/jade/symbol/record_type.rb +8 -0
  301. data/lib/jade/symbol/stdlib_function.rb +15 -0
  302. data/lib/jade/symbol/stdlib_implementation.rb +7 -0
  303. data/lib/jade/symbol/struct.rb +15 -0
  304. data/lib/jade/symbol/type_application.rb +8 -0
  305. data/lib/jade/symbol/type_ref.rb +11 -0
  306. data/lib/jade/symbol/union.rb +15 -0
  307. data/lib/jade/symbol/value_ref.rb +15 -0
  308. data/lib/jade/symbol/variable.rb +7 -0
  309. data/lib/jade/symbol/variant.rb +11 -0
  310. data/lib/jade/symbol.rb +162 -0
  311. data/lib/jade/task.rb +103 -0
  312. data/lib/jade/tasks/rspec.rb +266 -0
  313. data/lib/jade/tasks.rb +70 -0
  314. data/lib/jade/type/anonymous_record.rb +33 -0
  315. data/lib/jade/type/application.rb +21 -0
  316. data/lib/jade/type/base.rb +9 -0
  317. data/lib/jade/type/constraint.rb +17 -0
  318. data/lib/jade/type/constructor.rb +19 -0
  319. data/lib/jade/type/function.rb +18 -0
  320. data/lib/jade/type/partial_application.rb +17 -0
  321. data/lib/jade/type/unit.rb +15 -0
  322. data/lib/jade/type/var.rb +21 -0
  323. data/lib/jade/type.rb +259 -0
  324. data/lib/jade/version.rb +3 -0
  325. data/lib/jade.rb +55 -0
  326. metadata +387 -0
@@ -0,0 +1,342 @@
1
+ require 'jade/stdlib/compiled'
2
+
3
+ module Jade
4
+ module Stdlib
5
+ module Clock
6
+ extend self
7
+ extend Compiled
8
+
9
+ def uri
10
+ 'clock.jd'
11
+ end
12
+
13
+ def imports
14
+ [Basics, Maybe, Result, Task, String, Tuple, Decode, Encode, Calendar]
15
+ end
16
+
17
+ def default_imports
18
+ []
19
+ end
20
+
21
+ def code
22
+ <<~JADE
23
+ module Clock exposing (
24
+ Duration,
25
+ Instant,
26
+ add,
27
+ at_time,
28
+ days,
29
+ diff,
30
+ epoch,
31
+ from_iso,
32
+ hours,
33
+ in_days,
34
+ in_hours,
35
+ in_millis,
36
+ in_minutes,
37
+ in_seconds,
38
+ millis,
39
+ minutes,
40
+ now,
41
+ on_date,
42
+ parts,
43
+ seconds,
44
+ to_iso,
45
+ )
46
+
47
+ import Decode exposing (Decodable, Decoder, Value)
48
+ import Encode exposing (Encodable)
49
+
50
+
51
+ type Instant = Instant(Int)
52
+
53
+
54
+ type Duration = Duration(Int)
55
+
56
+
57
+ uses Jade::Clock::Runtime with
58
+ now_raw : Task({ millis: Int }, Never)
59
+ end
60
+
61
+
62
+ def now -> Task(Instant, Never)
63
+ raw <- now_raw()
64
+ Task.succeed(Instant(raw.millis))
65
+ end
66
+
67
+
68
+ def epoch -> Instant
69
+ Instant(0)
70
+ end
71
+
72
+
73
+ def millis(n: Int) -> Duration
74
+ Duration(n)
75
+ end
76
+
77
+
78
+ def in_millis(d: Duration) -> Int
79
+ Duration(n) = d
80
+ n
81
+ end
82
+
83
+
84
+ def seconds(n: Int) -> Duration
85
+ Duration(n * 1000)
86
+ end
87
+
88
+
89
+ def in_seconds(d: Duration) -> Int
90
+ in_millis(d) / 1000
91
+ end
92
+
93
+
94
+ def minutes(n: Int) -> Duration
95
+ Duration(n * 60000)
96
+ end
97
+
98
+
99
+ def in_minutes(d: Duration) -> Int
100
+ in_millis(d) / 60000
101
+ end
102
+
103
+
104
+ def hours(n: Int) -> Duration
105
+ Duration(n * 3600000)
106
+ end
107
+
108
+
109
+ def in_hours(d: Duration) -> Int
110
+ in_millis(d) / 3600000
111
+ end
112
+
113
+
114
+ def days(n: Int) -> Duration
115
+ Duration(n * 86400000)
116
+ end
117
+
118
+
119
+ def in_days(d: Duration) -> Int
120
+ in_millis(d) / 86400000
121
+ end
122
+
123
+
124
+ def parts(d: Duration) -> {
125
+ days: Int,
126
+ hours: Int,
127
+ minutes: Int,
128
+ seconds: Int,
129
+ millis: Int,
130
+ }
131
+ ms = in_millis(d)
132
+ {
133
+ days: ms / 86400000,
134
+ hours: mod(ms, 86400000) / 3600000,
135
+ minutes: mod(ms, 3600000) / 60000,
136
+ seconds: mod(ms, 60000) / 1000,
137
+ millis: mod(ms, 1000),
138
+ }
139
+ end
140
+
141
+
142
+ def add(i: Instant, d: Duration) -> Instant
143
+ Instant(ms) = i
144
+ Instant(ms + in_millis(d))
145
+ end
146
+
147
+
148
+ def diff(a: Instant, b: Instant) -> Duration
149
+ Instant(ams) = a
150
+ Instant(bms) = b
151
+ Duration(bms - ams)
152
+ end
153
+
154
+
155
+ def on_date(i: Instant) -> Calendar.Date
156
+ Instant(ms) = i
157
+ Calendar.from_rata_die(floor_div(ms, 86400000) + 719163)
158
+ end
159
+
160
+
161
+ def at_time(i: Instant) -> {
162
+ hour: Int,
163
+ minute: Int,
164
+ second: Int,
165
+ millisecond: Int,
166
+ }
167
+ Instant(ms) = i
168
+ day_ms = mod(ms, 86400000)
169
+ {
170
+ hour: day_ms / 3600000,
171
+ minute: mod(day_ms, 3600000) / 60000,
172
+ second: mod(day_ms, 60000) / 1000,
173
+ millisecond: mod(day_ms, 1000),
174
+ }
175
+ end
176
+
177
+
178
+ def floor_div(a: Int, b: Int) -> Int
179
+ q = a / b
180
+ a < 0 && mod(a, b) != 0 ? q - 1 : q
181
+ end
182
+
183
+
184
+ def to_iso(i: Instant) -> String
185
+ d = on_date(i)
186
+ tod = at_time(i)
187
+ Calendar.to_iso_string(d)
188
+ ++ "T"
189
+ ++ pad2(tod.hour)
190
+ ++ ":"
191
+ ++ pad2(tod.minute)
192
+ ++ ":"
193
+ ++ pad2(tod.second)
194
+ ++ "Z"
195
+ end
196
+
197
+
198
+ def pad2(n: Int) -> String
199
+ s = String.from_int(n)
200
+ String.length(s) < 2 ? "0" ++ s : s
201
+ end
202
+
203
+
204
+ def from_iso(s: String) -> Result(Instant, String)
205
+ case split_dt(s)
206
+ in Just((date_part, time_part))
207
+ case (Calendar.from_iso_string(date_part), parse_time(time_part))
208
+ in (Ok(d), Ok((h, m, sec, sub))) then Ok(combine(d, h, m, sec, sub))
209
+ else Err("invalid timestamp: " ++ s)
210
+ end
211
+ in Nothing then Err("invalid timestamp: " ++ s)
212
+ end
213
+ end
214
+
215
+
216
+ def split_dt(s: String) -> Maybe((String, String))
217
+ case String.split(s, "T")
218
+ in [d, t] then Just((d, t))
219
+ else
220
+ case String.split(s, " ")
221
+ in [d, t] then Just((d, t))
222
+ else Nothing
223
+ end
224
+ end
225
+ end
226
+
227
+
228
+ def parse_time(s: String) -> Result((Int, Int, Int, Int), String)
229
+ case String.split(strip_z(s), ":")
230
+ in [h, m, sec_part]
231
+ case (String.to_int(h), String.to_int(m), parse_seconds(sec_part))
232
+ in (Just(hi), Just(mi), Just((si, ms))) then Ok((hi, mi, si, ms))
233
+ else Err("bad time: " ++ s)
234
+ end
235
+ else Err("bad time: " ++ s)
236
+ end
237
+ end
238
+
239
+
240
+ def strip_z(s: String) -> String
241
+ case String.split(s, "Z")
242
+ in [head, _] then head
243
+ in [head] then head
244
+ else s
245
+ end
246
+ end
247
+
248
+
249
+ def parse_seconds(s: String) -> Maybe((Int, Int))
250
+ case String.split(s, ".")
251
+ in [secs]
252
+ case String.to_int(secs)
253
+ in Just(si) then Just((si, 0))
254
+ in Nothing then Nothing
255
+ end
256
+ in [secs, frac]
257
+ case (String.to_int(secs), String.to_int(frac))
258
+ in (Just(si), Just(fi))
259
+ Just((si, frac_to_millis(fi, String.length(frac))))
260
+ else Nothing
261
+ end
262
+ else Nothing
263
+ end
264
+ end
265
+
266
+
267
+ def frac_to_millis(n: Int, digits: Int) -> Int
268
+ digits == 3 ? n : digits < 3 ? n * pow10(3 - digits) : n / pow10(digits - 3)
269
+ end
270
+
271
+
272
+ def pow10(n: Int) -> Int
273
+ n <= 0 ? 1 : 10 * pow10(n - 1)
274
+ end
275
+
276
+
277
+ def combine(
278
+ d: Calendar.Date,
279
+ hour: Int,
280
+ minute: Int,
281
+ second: Int,
282
+ sub_ms: Int,
283
+ ) -> Instant
284
+ day_count = Calendar.to_rata_die(d) - 719163
285
+ Instant(
286
+ day_count * 86400000 + hour * 3600000 + minute * 60000 + second * 1000 + sub_ms,
287
+ )
288
+ end
289
+
290
+
291
+ def compare_instant(a: Instant, b: Instant) -> Ordering
292
+ Instant(ams) = a
293
+ Instant(bms) = b
294
+ compare(ams, bms)
295
+ end
296
+
297
+
298
+ def instant_eq(a: Instant, b: Instant) -> Bool
299
+ Instant(ams) = a
300
+ Instant(bms) = b
301
+ ams == bms
302
+ end
303
+
304
+
305
+ implements Comparable(Instant) with
306
+ compare: compare_instant
307
+ end
308
+
309
+
310
+ implements Eq(Instant) with
311
+ (==): instant_eq
312
+ end
313
+
314
+
315
+ def parse_instant(s: String) -> Decoder(Instant)
316
+ Decode.from_result(from_iso(s))
317
+ end
318
+
319
+
320
+ implements Decodable(Instant) with
321
+ decoder: -> { Decode.string |> Decode.and_then(parse_instant) }
322
+ end
323
+
324
+
325
+ implements Encodable(Instant) with
326
+ encoder: (i) -> { Encode.string(to_iso(i)) }
327
+ end
328
+
329
+
330
+ implements Decodable(Duration) with
331
+ decoder: -> { Decode.map(Decode.int, Duration) }
332
+ end
333
+
334
+
335
+ implements Encodable(Duration) with
336
+ encoder: (d) -> { Encode.int(in_millis(d)) }
337
+ end
338
+ JADE
339
+ end
340
+ end
341
+ end
342
+ end
@@ -0,0 +1,48 @@
1
+ module Jade
2
+ module Stdlib
3
+ module Compiled
4
+ def generate_entry(registry)
5
+ return @entry if @entry
6
+
7
+ source = Source[uri, code]
8
+
9
+ source
10
+ .then { Lexer.tokenize(it) }
11
+ .then { Parsing.parse(it, source:) } => Ok([ast, _comments])
12
+
13
+ Registry
14
+ .entry(source.to_module_name)
15
+ .with(ast:)
16
+ .with(source:)
17
+ .then { resolve_imports(it) }
18
+ .then do
19
+ Frontend
20
+ .run_entry(it, registry.add_module(it))
21
+ .map { Codegen.generate_entry(it, registry.add_module(it)) }
22
+ end => Ok(entry)
23
+
24
+ @entry = entry
25
+ end
26
+
27
+ def entry
28
+ @entry ||= fail("entry not generated yet.")
29
+ end
30
+
31
+ # Compiled modules declare interfaces and impls in their Jade source,
32
+ # not via the Intrinsics DSL. The lookup that scans `imports` for
33
+ # Interface symbols (intrinsics.rb#implementation) never finds anything
34
+ # here, but exposing an empty list keeps the call site uniform.
35
+ def symbols
36
+ []
37
+ end
38
+
39
+ def resolve_imports(entry)
40
+ imports
41
+ .reduce(entry) do |acc, stdlib|
42
+ ImportEntry[stdlib.entry.name, stdlib.entry.name, stdlib.default_imports, stdlib.entry.exposes]
43
+ .then { acc.import(it) }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,154 @@
1
+ require 'jade/stdlib/compiled'
2
+
3
+ module Jade
4
+ module Stdlib
5
+ module Decode
6
+ module Params
7
+ extend self
8
+ extend Compiled
9
+
10
+ def uri
11
+ 'decode/params.jd'
12
+ end
13
+
14
+ def imports
15
+ [Basics, Maybe, List, Tuple, Stdlib::String, Stdlib::Decode]
16
+ end
17
+
18
+ def default_imports
19
+ []
20
+ end
21
+
22
+ def code
23
+ <<~JADE
24
+ module Decode.Params exposing (
25
+ Params(..),
26
+ accept,
27
+ bool,
28
+ collect,
29
+ default,
30
+ empty,
31
+ float,
32
+ int,
33
+ nested,
34
+ string,
35
+ )
36
+
37
+ import Decode exposing (Decoder)
38
+
39
+
40
+ type Params(a) = Params(List((String, Decoder(a))), List((String, a)))
41
+
42
+
43
+ def empty -> Params(a)
44
+ Params([], [])
45
+ end
46
+
47
+
48
+ def accept(p: Params(a), key: String, decoder: Decoder(a)) -> Params(a)
49
+ case p
50
+ in Params(accs, defs) then Params(accs ++ [(key, decoder)], defs)
51
+ end
52
+ end
53
+
54
+
55
+ def default(p: Params(a), key: String, value: a) -> Params(a)
56
+ case p
57
+ in Params(accs, defs) then Params(accs, defs ++ [(key, value)])
58
+ end
59
+ end
60
+
61
+
62
+ def string(p: Params(a), key: String, ctor: String -> a) -> Params(a)
63
+ accept(p, key, Decode.map(Decode.string, ctor))
64
+ end
65
+
66
+
67
+ def int(p: Params(a), key: String, ctor: Int -> a) -> Params(a)
68
+ accept(p, key, Decode.map(Decode.int, ctor))
69
+ end
70
+
71
+
72
+ def float(p: Params(a), key: String, ctor: Float -> a) -> Params(a)
73
+ accept(p, key, Decode.map(Decode.float, ctor))
74
+ end
75
+
76
+
77
+ def bool(p: Params(a), key: String, ctor: Bool -> a) -> Params(a)
78
+ accept(p, key, Decode.map(Decode.bool, ctor))
79
+ end
80
+
81
+
82
+ def nested(
83
+ p: Params(a),
84
+ key: String,
85
+ ctor: List(b) -> a,
86
+ sub: Params(b),
87
+ ) -> Params(a)
88
+ accept(p, key, Decode.map(collect(sub), ctor))
89
+ end
90
+
91
+
92
+ def collect(p: Params(a)) -> Decoder(List(a))
93
+ case p
94
+ in Params(accs, defs)
95
+ accs
96
+ |> List.map((acc) -> { accept_to_decoder(defs, acc) })
97
+ |> Decode.sequence
98
+ |> Decode.map(filter_justs)
99
+ end
100
+ end
101
+
102
+
103
+ def accept_to_decoder(
104
+ defs: List((String, a)),
105
+ acc: (String, Decoder(a)),
106
+ ) -> Decoder(Maybe(a))
107
+ key = Tuple.first(acc)
108
+ decoder = Tuple.second(acc)
109
+ raw = Decode.optional_field(key, decoder)
110
+ case lookup_default(defs, key)
111
+ in Just(v) then with_default(raw, v)
112
+ in Nothing then raw
113
+ end
114
+ end
115
+
116
+
117
+ def with_default(decoder: Decoder(Maybe(a)), v: a) -> Decoder(Maybe(a))
118
+ Decode.map(decoder, (m) -> { maybe_or_just(m, v) })
119
+ end
120
+
121
+
122
+ def maybe_or_just(m: Maybe(a), v: a) -> Maybe(a)
123
+ case m
124
+ in Just(_) then m
125
+ in Nothing then Just(v)
126
+ end
127
+ end
128
+
129
+
130
+ def filter_justs(maybes: List(Maybe(a))) -> List(a)
131
+ List.and_then(maybes, maybe_to_list)
132
+ end
133
+
134
+
135
+ def maybe_to_list(m: Maybe(a)) -> List(a)
136
+ case m
137
+ in Just(x) then [x]
138
+ in Nothing then []
139
+ end
140
+ end
141
+
142
+
143
+ def lookup_default(defs: List((String, a)), key: String) -> Maybe(a)
144
+ case defs
145
+ in [] then Nothing
146
+ in [(k, v) | rest] then k == key ? Just(v) : lookup_default(rest, key)
147
+ end
148
+ end
149
+ JADE
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end