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,405 @@
1
+ require 'jade/stdlib/compiled'
2
+
3
+ module Jade
4
+ module Stdlib
5
+ module Calendar
6
+ extend self
7
+ extend Compiled
8
+
9
+ def uri
10
+ 'calendar.jd'
11
+ end
12
+
13
+ def imports
14
+ [Basics, Maybe, Result, Task, String, Tuple, Decode, Encode]
15
+ end
16
+
17
+ def default_imports
18
+ []
19
+ end
20
+
21
+ def code
22
+ <<~JADE
23
+ module Calendar exposing (
24
+ Date,
25
+ Month(..),
26
+ Unit(..),
27
+ Weekday(..),
28
+ add,
29
+ day,
30
+ diff,
31
+ from_calendar_date,
32
+ from_iso_string,
33
+ from_rata_die,
34
+ month,
35
+ month_from_int,
36
+ month_to_int,
37
+ to_iso_string,
38
+ to_rata_die,
39
+ today,
40
+ weekday,
41
+ weekday_from_int,
42
+ weekday_to_int,
43
+ year,
44
+ )
45
+
46
+ import Decode exposing (Decodable, Decoder, Value)
47
+ import Encode exposing (Encodable)
48
+
49
+
50
+ type Month
51
+ = Jan
52
+ | Feb
53
+ | Mar
54
+ | Apr
55
+ | May
56
+ | Jun
57
+ | Jul
58
+ | Aug
59
+ | Sep
60
+ | Oct
61
+ | Nov
62
+ | Dec
63
+
64
+
65
+ type Weekday
66
+ = Mon
67
+ | Tue
68
+ | Wed
69
+ | Thu
70
+ | Fri
71
+ | Sat
72
+ | Sun
73
+
74
+
75
+ type Unit
76
+ = Years
77
+ | Months
78
+ | Weeks
79
+ | Days
80
+
81
+
82
+ struct Date = {
83
+ year: Int,
84
+ month: Month,
85
+ day: Int
86
+ }
87
+
88
+
89
+ uses Jade::Calendar::Runtime with
90
+ today_raw : Task({ year: Int, month: Int, day: Int }, Never)
91
+ end
92
+
93
+
94
+ def today -> Task(Date, Never)
95
+ raw <- today_raw()
96
+ Task.succeed(Date(raw.year, month_from_int(raw.month), raw.day))
97
+ end
98
+
99
+
100
+ def from_calendar_date(y: Int, m: Month, d: Int) -> Date
101
+ Date(y, m, d)
102
+ end
103
+
104
+
105
+ def year(d: Date) -> Int
106
+ d.year
107
+ end
108
+
109
+
110
+ def month(d: Date) -> Month
111
+ d.month
112
+ end
113
+
114
+
115
+ def day(d: Date) -> Int
116
+ d.day
117
+ end
118
+
119
+
120
+ def month_to_int(m: Month) -> Int
121
+ case m
122
+ in Jan then 1
123
+ in Feb then 2
124
+ in Mar then 3
125
+ in Apr then 4
126
+ in May then 5
127
+ in Jun then 6
128
+ in Jul then 7
129
+ in Aug then 8
130
+ in Sep then 9
131
+ in Oct then 10
132
+ in Nov then 11
133
+ in Dec then 12
134
+ end
135
+ end
136
+
137
+
138
+ def month_from_int(i: Int) -> Month
139
+ case i
140
+ in 1 then Jan
141
+ in 2 then Feb
142
+ in 3 then Mar
143
+ in 4 then Apr
144
+ in 5 then May
145
+ in 6 then Jun
146
+ in 7 then Jul
147
+ in 8 then Aug
148
+ in 9 then Sep
149
+ in 10 then Oct
150
+ in 11 then Nov
151
+ in 12 then Dec
152
+ else Jan
153
+ end
154
+ end
155
+
156
+
157
+ def weekday_to_int(w: Weekday) -> Int
158
+ case w
159
+ in Mon then 1
160
+ in Tue then 2
161
+ in Wed then 3
162
+ in Thu then 4
163
+ in Fri then 5
164
+ in Sat then 6
165
+ in Sun then 7
166
+ end
167
+ end
168
+
169
+
170
+ def weekday_from_int(i: Int) -> Weekday
171
+ case i
172
+ in 1 then Mon
173
+ in 2 then Tue
174
+ in 3 then Wed
175
+ in 4 then Thu
176
+ in 5 then Fri
177
+ in 6 then Sat
178
+ in 7 then Sun
179
+ else Mon
180
+ end
181
+ end
182
+
183
+
184
+ def days_in_month(y: Int, m: Month) -> Int
185
+ case m
186
+ in Jan then 31
187
+ in Feb then leap?(y) ? 29 : 28
188
+ in Mar then 31
189
+ in Apr then 30
190
+ in May then 31
191
+ in Jun then 30
192
+ in Jul then 31
193
+ in Aug then 31
194
+ in Sep then 30
195
+ in Oct then 31
196
+ in Nov then 30
197
+ in Dec then 31
198
+ end
199
+ end
200
+
201
+
202
+ def leap?(y: Int) -> Bool
203
+ (mod(y, 4) == 0) && ((mod(y, 100) != 0) || (mod(y, 400) == 0))
204
+ end
205
+
206
+
207
+ def days_before_year(y: Int) -> Int
208
+ n = y - 1
209
+ n * 365 + n / 4 - n / 100 + n / 400
210
+ end
211
+
212
+
213
+ def days_before_month(y: Int, m: Month) -> Int
214
+ mi = month_to_int(m)
215
+ base = (case mi
216
+ in 1 then 0
217
+ in 2 then 31
218
+ in 3 then 59
219
+ in 4 then 90
220
+ in 5 then 120
221
+ in 6 then 151
222
+ in 7 then 181
223
+ in 8 then 212
224
+ in 9 then 243
225
+ in 10 then 273
226
+ in 11 then 304
227
+ in 12 then 334
228
+ else 0
229
+ end)
230
+ mi > 2 && leap?(y) ? base + 1 : base
231
+ end
232
+
233
+
234
+ def to_rata_die(d: Date) -> Int
235
+ days_before_year(d.year) + days_before_month(d.year, d.month) + d.day
236
+ end
237
+
238
+
239
+ def weekday(d: Date) -> Weekday
240
+ weekday_from_int(mod(to_rata_die(d) - 1, 7) + 1)
241
+ end
242
+
243
+
244
+ def pad_to(s: String, width: Int) -> String
245
+ len = String.length(s)
246
+ len < width ? String.repeat("0", width - len) ++ s : s
247
+ end
248
+
249
+
250
+ def to_iso_string(d: Date) -> String
251
+ pad_to(String.from_int(d.year), 4)
252
+ ++ "-"
253
+ ++ pad_to(String.from_int(month_to_int(d.month)), 2)
254
+ ++ "-"
255
+ ++ pad_to(String.from_int(d.day), 2)
256
+ end
257
+
258
+
259
+ def from_iso_string(s: String) -> Result(Date, String)
260
+ case String.split(s, "-")
261
+ in [y, m, day_str]
262
+ case (String.to_int(y), String.to_int(m), String.to_int(day_str))
263
+ in (Just(yi), Just(mi), Just(di))
264
+ Ok(from_calendar_date(yi, month_from_int(mi), di))
265
+ else Err("invalid ISO date: " ++ s)
266
+ end
267
+ else Err("invalid ISO date: " ++ s)
268
+ end
269
+ end
270
+
271
+
272
+ def add(d: Date, unit: Unit, n: Int) -> Date
273
+ case unit
274
+ in Days then add_days(d, n)
275
+ in Weeks then add_days(d, n * 7)
276
+ in Months then add_months(d, n)
277
+ in Years then add_months(d, n * 12)
278
+ end
279
+ end
280
+
281
+
282
+ def add_days(d: Date, n: Int) -> Date
283
+ from_rata_die(to_rata_die(d) + n)
284
+ end
285
+
286
+
287
+ def add_months(d: Date, n: Int) -> Date
288
+ total = month_to_int(d.month) - 1 + n
289
+ new_year = d.year + total / 12
290
+ new_month = month_from_int(mod(total, 12) + 1)
291
+ from_calendar_date(
292
+ new_year,
293
+ new_month,
294
+ min(d.day, days_in_month(new_year, new_month)),
295
+ )
296
+ end
297
+
298
+
299
+ def min(a: Int, b: Int) -> Int
300
+ a < b ? a : b
301
+ end
302
+
303
+
304
+ def diff(a: Date, b: Date, unit: Unit) -> Int
305
+ case unit
306
+ in Days then to_rata_die(b) - to_rata_die(a)
307
+ in Weeks then (to_rata_die(b) - to_rata_die(a)) / 7
308
+ in Months then calendar_months(a, b)
309
+ in Years then calendar_months(a, b) / 12
310
+ end
311
+ end
312
+
313
+
314
+ def calendar_months(a: Date, b: Date) -> Int
315
+ raw = (b.year - a.year) * 12 + (month_to_int(b.month) - month_to_int(a.month))
316
+ raw > 0 && b.day < a.day ? raw - 1 : raw < 0 && b.day > a.day ? raw + 1 : raw
317
+ end
318
+
319
+
320
+ def from_rata_die(rd: Int) -> Date
321
+ y = bump_year(rd, (rd - 1) / 366 + 1)
322
+ doy = rd - days_before_year(y)
323
+ case search_month(y, doy, 12)
324
+ in (m, d) then from_calendar_date(y, m, d)
325
+ end
326
+ end
327
+
328
+
329
+ def bump_year(rd: Int, y: Int) -> Int
330
+ days_before_year(y + 1) < rd ? bump_year(rd, y + 1) : y
331
+ end
332
+
333
+
334
+ def search_month(y: Int, doy: Int, mi: Int) -> (Month, Int)
335
+ m = month_from_int(mi)
336
+ offset = days_before_month(y, m)
337
+ doy > offset ? (m, doy - offset) : search_month(y, doy, mi - 1)
338
+ end
339
+
340
+
341
+ def compare_month(a: Month, b: Month) -> Ordering
342
+ compare(month_to_int(a), month_to_int(b))
343
+ end
344
+
345
+
346
+ def month_eq(a: Month, b: Month) -> Bool
347
+ month_to_int(a) == month_to_int(b)
348
+ end
349
+
350
+
351
+ implements Comparable(Month) with
352
+ compare: compare_month
353
+ end
354
+
355
+
356
+ implements Eq(Month) with
357
+ (==): month_eq
358
+ end
359
+
360
+
361
+ def compare_date(a: Date, b: Date) -> Ordering
362
+ case compare(a.year, b.year)
363
+ in EQ
364
+ case compare_month(a.month, b.month)
365
+ in EQ then compare(a.day, b.day)
366
+ in o then o
367
+ end
368
+ in o then o
369
+ end
370
+ end
371
+
372
+
373
+ def date_eq(a: Date, b: Date) -> Bool
374
+ a.year == b.year && a.month == b.month && a.day == b.day
375
+ end
376
+
377
+
378
+ implements Comparable(Date) with
379
+ compare: compare_date
380
+ end
381
+
382
+
383
+ implements Eq(Date) with
384
+ (==): date_eq
385
+ end
386
+
387
+
388
+ def parse_date(s: String) -> Decoder(Date)
389
+ Decode.from_result(from_iso_string(s))
390
+ end
391
+
392
+
393
+ implements Decodable(Date) with
394
+ decoder: -> { Decode.string |> Decode.and_then(parse_date) }
395
+ end
396
+
397
+
398
+ implements Encodable(Date) with
399
+ encoder: (d) -> { Encode.string(to_iso_string(d)) }
400
+ end
401
+ JADE
402
+ end
403
+ end
404
+ end
405
+ end
@@ -0,0 +1,27 @@
1
+ require 'jade/stdlib/intrinsics'
2
+
3
+ module Jade
4
+ module Stdlib
5
+ module Char
6
+ extend Intrinsics
7
+
8
+ import Basics
9
+
10
+ union :Char
11
+
12
+ implementation('Eq', 'Char', '(==)' => 'char_eq')
13
+
14
+ function(:to_code, { char: 'Char' }, 'Int')
15
+ function(:from_code, { code: 'Int' }, 'Maybe(Char)')
16
+ function(:"digit?", { char: 'Char' }, 'Bool')
17
+ function(:"alpha?", { char: 'Char' }, 'Bool')
18
+ function(:"alpha_numeric?", { char: 'Char' }, 'Bool')
19
+ function(:"upper?", { char: 'Char' }, 'Bool')
20
+ function(:"lower?", { char: 'Char' }, 'Bool')
21
+
22
+ default_importing('Char')
23
+
24
+ function('char_eq', { one: 'Char', other: 'Char' }, 'Bool')
25
+ end
26
+ end
27
+ end