language-ruby 0.5.6 → 0.6.1

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 (203) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.ruby-version +1 -0
  4. data/.tool-versions +1 -1
  5. data/Gemfile +5 -4
  6. data/Gemfile.lock +12 -23
  7. data/README.md +2 -102
  8. data/language-ruby.gemspec +7 -5
  9. data/lib/language/atom/absent.rb +29 -0
  10. data/lib/language/atom/aka.rb +32 -0
  11. data/lib/language/atom/and.rb +32 -0
  12. data/lib/language/atom/any.rb +15 -0
  13. data/lib/language/atom/ignore.rb +27 -0
  14. data/lib/language/atom/maybe.rb +32 -0
  15. data/lib/language/atom/or.rb +46 -0
  16. data/lib/language/atom/repeat.rb +57 -0
  17. data/lib/language/atom/str.rb +21 -0
  18. data/lib/language/atom/then.rb +21 -0
  19. data/lib/language/atom.rb +10 -291
  20. data/lib/language/output.rb +13 -11
  21. data/lib/language/parser/absent/present.rb +2 -0
  22. data/lib/language/parser/absent.rb +2 -0
  23. data/lib/language/parser/end_of_input.rb +2 -0
  24. data/lib/language/parser/interuption.rb +2 -0
  25. data/lib/language/parser/not_end_of_input.rb +2 -0
  26. data/lib/language/parser/str/not_found.rb +2 -0
  27. data/lib/language/parser/str.rb +2 -0
  28. data/lib/language/parser.rb +10 -10
  29. data/lib/language/version.rb +5 -0
  30. data/lib/language-ruby.rb +2 -5
  31. data/lib/language.rb +9 -7
  32. data/spec/language_spec.rb +21 -0
  33. data/spec/spec_helper.rb +2 -5
  34. metadata +18 -218
  35. data/.cherry.js +0 -21
  36. data/.editorconfig +0 -9
  37. data/.github/workflows/rspec.yml +0 -14
  38. data/.prettierrc +0 -3
  39. data/CHANGELOG.md +0 -55
  40. data/LICENSE +0 -7
  41. data/TODO +0 -17
  42. data/bin/code +0 -76
  43. data/bin/format +0 -3
  44. data/bin/publish +0 -19
  45. data/bin/template +0 -85
  46. data/bin/test +0 -17
  47. data/code-ruby.gemspec +0 -17
  48. data/docs/class.code +0 -9
  49. data/docs/euler/1.template +0 -10
  50. data/docs/euler/2.template +0 -16
  51. data/docs/euler/3.template +0 -16
  52. data/docs/euler/4.template +0 -10
  53. data/docs/euler/5.template +0 -13
  54. data/docs/fibonnaci.template +0 -14
  55. data/docs/meetup.code +0 -12
  56. data/docs/precedence.template +0 -36
  57. data/docs/rain.code +0 -22
  58. data/docs/slack.code +0 -17
  59. data/docs/stripe.code +0 -7
  60. data/docs/twitter.code +0 -9
  61. data/lib/code/error.rb +0 -18
  62. data/lib/code/node/base_10.rb +0 -29
  63. data/lib/code/node/base_16.rb +0 -13
  64. data/lib/code/node/base_2.rb +0 -13
  65. data/lib/code/node/base_8.rb +0 -13
  66. data/lib/code/node/boolean.rb +0 -22
  67. data/lib/code/node/call.rb +0 -47
  68. data/lib/code/node/call_argument.rb +0 -21
  69. data/lib/code/node/chained_call.rb +0 -23
  70. data/lib/code/node/code.rb +0 -20
  71. data/lib/code/node/decimal.rb +0 -26
  72. data/lib/code/node/dictionnary.rb +0 -33
  73. data/lib/code/node/equal.rb +0 -34
  74. data/lib/code/node/function.rb +0 -20
  75. data/lib/code/node/function_parameter.rb +0 -31
  76. data/lib/code/node/if.rb +0 -59
  77. data/lib/code/node/if_modifier.rb +0 -47
  78. data/lib/code/node/list.rb +0 -16
  79. data/lib/code/node/negation.rb +0 -15
  80. data/lib/code/node/not.rb +0 -15
  81. data/lib/code/node/nothing.rb +0 -12
  82. data/lib/code/node/number.rb +0 -25
  83. data/lib/code/node/operation.rb +0 -38
  84. data/lib/code/node/power.rb +0 -20
  85. data/lib/code/node/rescue.rb +0 -17
  86. data/lib/code/node/splat.rb +0 -15
  87. data/lib/code/node/statement.rb +0 -59
  88. data/lib/code/node/string.rb +0 -53
  89. data/lib/code/node/ternary.rb +0 -24
  90. data/lib/code/node/unary_minus.rb +0 -15
  91. data/lib/code/node/while.rb +0 -35
  92. data/lib/code/node.rb +0 -13
  93. data/lib/code/object/argument.rb +0 -32
  94. data/lib/code/object/boolean.rb +0 -27
  95. data/lib/code/object/decimal.rb +0 -162
  96. data/lib/code/object/dictionnary.rb +0 -96
  97. data/lib/code/object/function.rb +0 -64
  98. data/lib/code/object/global.rb +0 -42
  99. data/lib/code/object/integer.rb +0 -221
  100. data/lib/code/object/list.rb +0 -207
  101. data/lib/code/object/nothing.rb +0 -23
  102. data/lib/code/object/number.rb +0 -6
  103. data/lib/code/object/range.rb +0 -146
  104. data/lib/code/object/ruby_function.rb +0 -31
  105. data/lib/code/object/string.rb +0 -102
  106. data/lib/code/object.rb +0 -197
  107. data/lib/code/parser/addition.rb +0 -21
  108. data/lib/code/parser/and_operator.rb +0 -17
  109. data/lib/code/parser/bitwise_and.rb +0 -17
  110. data/lib/code/parser/bitwise_or.rb +0 -21
  111. data/lib/code/parser/boolean.rb +0 -17
  112. data/lib/code/parser/call.rb +0 -122
  113. data/lib/code/parser/chained_call.rb +0 -47
  114. data/lib/code/parser/class.rb +0 -45
  115. data/lib/code/parser/code.rb +0 -25
  116. data/lib/code/parser/dictionnary.rb +0 -67
  117. data/lib/code/parser/equal.rb +0 -94
  118. data/lib/code/parser/equality.rb +0 -35
  119. data/lib/code/parser/equality_lower.rb +0 -9
  120. data/lib/code/parser/function.rb +0 -85
  121. data/lib/code/parser/greater.rb +0 -25
  122. data/lib/code/parser/group.rb +0 -22
  123. data/lib/code/parser/if.rb +0 -63
  124. data/lib/code/parser/if_modifier.rb +0 -55
  125. data/lib/code/parser/list.rb +0 -42
  126. data/lib/code/parser/multiplication.rb +0 -25
  127. data/lib/code/parser/name.rb +0 -107
  128. data/lib/code/parser/negation.rb +0 -30
  129. data/lib/code/parser/not_keyword.rb +0 -23
  130. data/lib/code/parser/nothing.rb +0 -22
  131. data/lib/code/parser/number.rb +0 -154
  132. data/lib/code/parser/operation.rb +0 -35
  133. data/lib/code/parser/or_keyword.rb +0 -21
  134. data/lib/code/parser/or_operator.rb +0 -17
  135. data/lib/code/parser/power.rb +0 -43
  136. data/lib/code/parser/range.rb +0 -17
  137. data/lib/code/parser/rescue.rb +0 -39
  138. data/lib/code/parser/shift.rb +0 -21
  139. data/lib/code/parser/splat.rb +0 -31
  140. data/lib/code/parser/statement.rb +0 -9
  141. data/lib/code/parser/string.rb +0 -78
  142. data/lib/code/parser/ternary.rb +0 -46
  143. data/lib/code/parser/unary_minus.rb +0 -31
  144. data/lib/code/parser/while.rb +0 -36
  145. data/lib/code/parser/whitespace.rb +0 -49
  146. data/lib/code/parser.rb +0 -19
  147. data/lib/code/ruby.rb +0 -174
  148. data/lib/code-ruby.rb +0 -10
  149. data/lib/code.rb +0 -47
  150. data/lib/template/node/code_part.rb +0 -13
  151. data/lib/template/node/part.rb +0 -19
  152. data/lib/template/node/template.rb +0 -15
  153. data/lib/template/node/text_part.rb +0 -13
  154. data/lib/template/node.rb +0 -4
  155. data/lib/template/parser/template.rb +0 -39
  156. data/lib/template/parser.rb +0 -19
  157. data/lib/template/version.rb +0 -3
  158. data/lib/template-ruby.rb +0 -10
  159. data/lib/template.rb +0 -50
  160. data/spec/code/addition_spec.rb +0 -13
  161. data/spec/code/and_operator_spec.rb +0 -13
  162. data/spec/code/bitwise_and_spec.rb +0 -13
  163. data/spec/code/bitwise_or_spec.rb +0 -13
  164. data/spec/code/boolean_spec.rb +0 -13
  165. data/spec/code/call_spec.rb +0 -21
  166. data/spec/code/chained_call_spec.rb +0 -16
  167. data/spec/code/code_spec.rb +0 -29
  168. data/spec/code/dictionnary_spec.rb +0 -17
  169. data/spec/code/equal_spec.rb +0 -26
  170. data/spec/code/equality_spec.rb +0 -13
  171. data/spec/code/function_spec.rb +0 -18
  172. data/spec/code/greater_spec.rb +0 -18
  173. data/spec/code/group_spec.rb +0 -12
  174. data/spec/code/if_modifier_spec.rb +0 -20
  175. data/spec/code/if_spec.rb +0 -25
  176. data/spec/code/list_spec.rb +0 -19
  177. data/spec/code/multiplication_spec.rb +0 -18
  178. data/spec/code/negation_spec.rb +0 -20
  179. data/spec/code/not_keyword_spec.rb +0 -13
  180. data/spec/code/nothing_spec.rb +0 -17
  181. data/spec/code/number_spec.rb +0 -22
  182. data/spec/code/or_keyword_spec.rb +0 -17
  183. data/spec/code/or_operator_spec.rb +0 -16
  184. data/spec/code/parser/boolean_spec.rb +0 -16
  185. data/spec/code/parser/call_spec.rb +0 -26
  186. data/spec/code/parser/chained_call.rb +0 -17
  187. data/spec/code/parser/dictionnary_spec.rb +0 -18
  188. data/spec/code/parser/function_spec.rb +0 -16
  189. data/spec/code/parser/group_spec.rb +0 -18
  190. data/spec/code/parser/list_spec.rb +0 -18
  191. data/spec/code/parser/number_spec.rb +0 -12
  192. data/spec/code/parser/string_spec.rb +0 -21
  193. data/spec/code/parser_spec.rb +0 -23
  194. data/spec/code/power_spec.rb +0 -13
  195. data/spec/code/range_spec.rb +0 -16
  196. data/spec/code/rescue_spec.rb +0 -13
  197. data/spec/code/shift_spec.rb +0 -13
  198. data/spec/code/splat_spec.rb +0 -13
  199. data/spec/code/string_spec.rb +0 -27
  200. data/spec/code/ternary_spec.rb +0 -18
  201. data/spec/code/unary_minus_spec.rb +0 -13
  202. data/spec/code/while_spec.rb +0 -18
  203. data/template-ruby.gemspec +0 -19
@@ -1,64 +0,0 @@
1
- class Code
2
- class Object
3
- class Function < ::Code::Object
4
- def initialize(parameters:, body:)
5
- @parameters = parameters
6
- @body = body
7
- end
8
-
9
- def call(**args)
10
- operator = args.fetch(:operator, nil)
11
- arguments = args.fetch(:arguments, [])
12
- globals = multi_fetch(args, *::Code::GLOBALS)
13
-
14
- if operator.nil? || operator == "call"
15
- call_function(args: arguments, globals: globals)
16
- else
17
- super
18
- end
19
- end
20
-
21
- def to_s
22
- ""
23
- end
24
-
25
- def inspect
26
- "function"
27
- end
28
-
29
- private
30
-
31
- attr_reader :parameters, :body
32
-
33
- def call_function(args:, globals:)
34
- new_context = deep_dup(globals[:context])
35
-
36
- parameters.each.with_index do |parameter, index|
37
- if parameter.regular?
38
- if parameter.regular_splat?
39
- new_context[parameter.name] = ::Code::Object::List.new(
40
- args.select(&:regular?).map(&:value)
41
- )
42
- elsif parameter.keyword_splat?
43
- new_context[parameter.name] = ::Code::Object::Dictionnary.new(
44
- args.select(&:keyword?).map(&:name_value).to_h
45
- )
46
- else
47
- arg = args[index]&.value
48
- arg = parameter.evaluate(**globals) if arg.nil?
49
- new_context[parameter.name] = arg
50
- end
51
- elsif parameter.keyword?
52
- arg = args.detect { |arg| arg.name == parameter.name }&.value
53
- arg = parameter.evaluate(**globals) if arg.nil?
54
- new_context[parameter.name] = arg
55
- else
56
- raise NotImplementedError
57
- end
58
- end
59
-
60
- body.evaluate(**globals, context: new_context)
61
- end
62
- end
63
- end
64
- end
@@ -1,42 +0,0 @@
1
- class Code
2
- class Object
3
- class Global < ::Code::Object
4
- def call(**args)
5
- operator = args.fetch(:operator, nil)
6
- arguments = args.fetch(:arguments, [])
7
- context = args.fetch(:context)
8
- io = args.fetch(:io)
9
- globals = multi_fetch(args, *::Code::GLOBALS)
10
- value = arguments.first&.value
11
-
12
- if operator == "print"
13
- io.print(*arguments.map(&:value))
14
- ::Code::Object::Nothing.new
15
- elsif operator == "puts"
16
- io.puts(*arguments.map(&:value))
17
- ::Code::Object::Nothing.new
18
- elsif operator == "context"
19
- sig(arguments) { ::Code::Object::String }
20
- context[value] || ::Code::Object::Nothing.new
21
- elsif operator == "evaluate"
22
- sig(arguments) { ::Code::Object::String }
23
- Code.evaluate(value.raw)
24
- else
25
- result = context[operator]
26
-
27
- if result && result.is_a?(::Code::Object::Function)
28
- result.call(**args.merge(operator: nil))
29
- elsif result
30
- result
31
- else
32
- raise ::Code::Error::Undefined.new("#{operator} is not defined")
33
- end
34
- end
35
- end
36
-
37
- def to_s
38
- "global"
39
- end
40
- end
41
- end
42
- end
@@ -1,221 +0,0 @@
1
- class Code
2
- class Object
3
- class Integer < ::Code::Object::Number
4
- attr_reader :raw
5
-
6
- def initialize(whole, exponent: nil)
7
- @raw = whole.to_i
8
-
9
- if exponent
10
- if exponent.is_a?(::Code::Object::Number)
11
- @raw = @raw * 10**exponent.raw
12
- else
13
- raise ::Code::Error::TypeError.new("exponent is not a number")
14
- end
15
- end
16
- end
17
-
18
- def call(**args)
19
- operator = args.fetch(:operator, nil)
20
- arguments = args.fetch(:arguments, [])
21
- globals = multi_fetch(args, *::Code::GLOBALS)
22
- value = arguments.first&.value
23
-
24
- if operator == "even?"
25
- sig(arguments)
26
- even?
27
- elsif operator == "odd?"
28
- sig(arguments)
29
- odd?
30
- elsif operator == "times"
31
- sig(arguments) { ::Code::Object::Function }
32
- times(value, **globals)
33
- elsif operator == "*"
34
- sig(arguments) { [[::Code::Object::Number, ::Code::Object::String]] }
35
- multiplication(value)
36
- elsif operator == "/"
37
- sig(arguments) { ::Code::Object::Number }
38
- division(value)
39
- elsif operator == "+"
40
- if value
41
- sig(arguments) { ::Code::Object }
42
- plus(value)
43
- else
44
- sig(arguments)
45
- self
46
- end
47
- elsif operator == "%"
48
- sig(arguments) { ::Code::Object::Number }
49
- modulo(value)
50
- elsif operator == "-"
51
- if value
52
- sig(arguments) { ::Code::Object::Number }
53
- minus(value)
54
- else
55
- sig(arguments)
56
- unary_minus
57
- end
58
- elsif operator == "**"
59
- sig(arguments) { ::Code::Object::Number }
60
- power(value)
61
- elsif operator == "<"
62
- sig(arguments) { ::Code::Object::Number }
63
- inferior(value)
64
- elsif operator == "<="
65
- sig(arguments) { ::Code::Object::Number }
66
- inferior_or_equal(value)
67
- elsif operator == ">"
68
- sig(arguments) { ::Code::Object::Number }
69
- superior(value)
70
- elsif operator == ">="
71
- sig(arguments) { ::Code::Object::Number }
72
- superior_or_equal(value)
73
- elsif operator == "<<"
74
- sig(arguments) { ::Code::Object::Number }
75
- left_shift(value)
76
- elsif operator == ">>"
77
- sig(arguments) { ::Code::Object::Number }
78
- right_shift(value)
79
- elsif operator == "&"
80
- sig(arguments) { ::Code::Object::Number }
81
- bitwise_and(value)
82
- elsif operator == "|"
83
- sig(arguments) { ::Code::Object::Number }
84
- bitwise_or(value)
85
- elsif operator == "^"
86
- sig(arguments) { ::Code::Object::Number }
87
- bitwise_xor(value)
88
- else
89
- super
90
- end
91
- end
92
-
93
- def succ
94
- ::Code::Object::Integer.new(raw + 1)
95
- end
96
-
97
- def +(other)
98
- ::Code::Object::Integer.new(raw + other.raw)
99
- end
100
-
101
- def to_s
102
- raw.to_s
103
- end
104
-
105
- def inspect
106
- to_s
107
- end
108
-
109
- private
110
-
111
- def even?
112
- ::Code::Object::Boolean.new(raw.even?)
113
- end
114
-
115
- def odd?
116
- ::Code::Object::Boolean.new(raw.odd?)
117
- end
118
-
119
- def multiplication(other)
120
- if other.is_a?(::Code::Object::Integer)
121
- ::Code::Object::Integer.new(raw * other.raw)
122
- elsif other.is_a?(::Code::Object::Decimal)
123
- ::Code::Object::Decimal.new(raw * other.raw)
124
- else
125
- ::Code::Object::String.new(other.raw * raw)
126
- end
127
- end
128
-
129
- def plus(other)
130
- if other.is_a?(::Code::Object::Integer)
131
- ::Code::Object::Integer.new(raw + other.raw)
132
- elsif other.is_a?(::Code::Object::Decimal)
133
- ::Code::Object::Decimal.new(raw + other.raw)
134
- else
135
- ::Code::Object::String.new(to_s + other.to_s)
136
- end
137
- end
138
-
139
- def division(other)
140
- ::Code::Object::Decimal.new(BigDecimal(raw) / other.raw)
141
- end
142
-
143
- def modulo(other)
144
- if other.is_a?(::Code::Object::Integer)
145
- ::Code::Object::Integer.new(raw % other.raw)
146
- else
147
- ::Code::Object::Decimal.new(raw % other.raw)
148
- end
149
- end
150
-
151
- def minus(other)
152
- if other.is_a?(::Code::Object::Integer)
153
- ::Code::Object::Integer.new(raw - other.raw)
154
- else
155
- ::Code::Object::Decimal.new(raw - other.raw)
156
- end
157
- end
158
-
159
- def unary_minus
160
- ::Code::Object::Integer.new(-raw)
161
- end
162
-
163
- def power(other)
164
- if other.is_a?(::Code::Object::Integer)
165
- ::Code::Object::Integer.new(raw**other.raw)
166
- else
167
- ::Code::Object::Decimal.new(raw**other.raw)
168
- end
169
- end
170
-
171
- def inferior(other)
172
- ::Code::Object::Boolean.new(raw < other.raw)
173
- end
174
-
175
- def inferior_or_equal(other)
176
- ::Code::Object::Boolean.new(raw <= other.raw)
177
- end
178
-
179
- def superior(other)
180
- ::Code::Object::Boolean.new(raw > other.raw)
181
- end
182
-
183
- def superior_or_equal(other)
184
- ::Code::Object::Boolean.new(raw >= other.raw)
185
- end
186
-
187
- def left_shift(other)
188
- ::Code::Object::Integer.new(raw << other.raw.to_i)
189
- end
190
-
191
- def right_shift(other)
192
- ::Code::Object::Integer.new(raw >> other.raw.to_i)
193
- end
194
-
195
- def bitwise_and(other)
196
- ::Code::Object::Integer.new(raw & other.raw.to_i)
197
- end
198
-
199
- def bitwise_or(other)
200
- ::Code::Object::Integer.new(raw | other.raw.to_i)
201
- end
202
-
203
- def bitwise_xor(other)
204
- ::Code::Object::Integer.new(raw ^ other.raw.to_i)
205
- end
206
-
207
- def times(argument, **globals)
208
- raw.times do |element|
209
- argument.call(
210
- arguments: [
211
- ::Code::Object::Argument.new(::Code::Object::Integer.new(element))
212
- ],
213
- **globals
214
- )
215
- end
216
-
217
- self
218
- end
219
- end
220
- end
221
- end
@@ -1,207 +0,0 @@
1
- class Code
2
- class Object
3
- class List < ::Code::Object
4
- attr_reader :raw
5
-
6
- def initialize(raw = [])
7
- @raw = raw
8
- end
9
-
10
- def call(**args)
11
- operator = args.fetch(:operator, nil)
12
- arguments = args.fetch(:arguments, [])
13
- globals = multi_fetch(args, *::Code::GLOBALS)
14
- value = arguments.first&.value
15
-
16
- if operator == "any?"
17
- sig(arguments) { ::Code::Object::Function }
18
- any?(value, **globals)
19
- elsif operator == "none?"
20
- sig(arguments) { ::Code::Object::Function }
21
- none?(value, **globals)
22
- elsif operator == "detect"
23
- sig(arguments) { ::Code::Object::Function }
24
- detect(value, **globals)
25
- elsif operator == "reduce"
26
- sig(arguments) { ::Code::Object::Function }
27
- reduce(value, **globals)
28
- elsif operator == "each"
29
- sig(arguments) { ::Code::Object::Function }
30
- each(value, **globals)
31
- elsif operator == "select"
32
- sig(arguments) { ::Code::Object::Function }
33
- select(value, **globals)
34
- elsif operator == "map"
35
- sig(arguments) { ::Code::Object::Function }
36
- map(value, **globals)
37
- elsif operator == "max_by"
38
- sig(arguments) { ::Code::Object::Function }
39
- max_by(value, **globals)
40
- elsif operator == "max"
41
- sig(arguments)
42
- max
43
- elsif operator == "flatten"
44
- sig(arguments)
45
- flatten
46
- elsif operator == "reverse"
47
- sig(arguments)
48
- reverse
49
- elsif operator == "first"
50
- sig(arguments)
51
- first
52
- elsif operator == "last"
53
- sig(arguments)
54
- last
55
- elsif operator == "<<"
56
- sig(arguments) { ::Code::Object }
57
- append(value)
58
- elsif operator == "include?"
59
- sig(arguments) { ::Code::Object }
60
- include?(value)
61
- else
62
- super
63
- end
64
- end
65
-
66
- def flatten
67
- ::Code::Object::List.new(
68
- raw.reduce([]) do |acc, element|
69
- if element.is_a?(::Code::Object::List)
70
- acc + element.flatten.raw
71
- else
72
- acc + [element]
73
- end
74
- end
75
- )
76
- end
77
-
78
- def deep_dup
79
- ::Code::Object::List.new(raw.deep_dup)
80
- end
81
-
82
- def <<(other)
83
- raw << other
84
- self
85
- end
86
-
87
- def to_s
88
- "[#{raw.map(&:inspect).join(", ")}]"
89
- end
90
-
91
- def inspect
92
- to_s
93
- end
94
-
95
- private
96
-
97
- def any?(argument, **globals)
98
- ::Code::Object::Boolean.new(
99
- raw.any? do |element|
100
- argument.call(
101
- arguments: [::Code::Object::Argument.new(element)],
102
- **globals
103
- ).truthy?
104
- end
105
- )
106
- end
107
-
108
- def none?(argument, **globals)
109
- ::Code::Object::Boolean.new(
110
- raw.none? do |element|
111
- argument.call(
112
- arguments: [::Code::Object::Argument.new(element)],
113
- **globals
114
- ).truthy?
115
- end
116
- )
117
- end
118
-
119
- def max_by(argument, **globals)
120
- raw.max_by do |element|
121
- argument.call(
122
- arguments: [::Code::Object::Argument.new(element)],
123
- **globals
124
- )
125
- end || ::Code::Object::Nothing.new
126
- end
127
-
128
- def detect(argument, **globals)
129
- raw.detect do |element|
130
- argument.call(
131
- arguments: [::Code::Object::Argument.new(element)],
132
- **globals
133
- ).truthy?
134
- end || ::Code::Object::Nothing.new
135
- end
136
-
137
- def reduce(argument, **globals)
138
- raw.reduce do |acc, element|
139
- argument.call(
140
- arguments: [
141
- ::Code::Object::Argument.new(acc),
142
- ::Code::Object::Argument.new(element)
143
- ],
144
- **globals
145
- )
146
- end || ::Code::Object::Nothing.new
147
- end
148
-
149
- def each(argument, **globals)
150
- raw.each do |element|
151
- argument.call(
152
- arguments: [::Code::Object::Argument.new(element)],
153
- **globals
154
- )
155
- end
156
- self
157
- end
158
-
159
- def select(argument, **globals)
160
- ::Code::Object::List.new(
161
- raw.select do |element|
162
- argument.call(
163
- arguments: [::Code::Object::Argument.new(element)],
164
- **globals
165
- ).truthy?
166
- end
167
- )
168
- end
169
-
170
- def map(argument, **globals)
171
- ::Code::Object::List.new(
172
- raw.map do |element|
173
- argument.call(
174
- arguments: [::Code::Object::Argument.new(element)],
175
- **globals
176
- )
177
- end
178
- )
179
- end
180
-
181
- def append(other)
182
- raw << other
183
- self
184
- end
185
-
186
- def include?(other)
187
- ::Code::Object::Boolean.new(raw.include?(other))
188
- end
189
-
190
- def first
191
- raw.first || ::Code::Object::Nothing.new
192
- end
193
-
194
- def max
195
- raw.max || ::Code::Object::Nothing.new
196
- end
197
-
198
- def reverse
199
- ::Code::Object::List.new(raw.reverse)
200
- end
201
-
202
- def last
203
- raw.last || ::Code::Object::Nothing.new
204
- end
205
- end
206
- end
207
- end
@@ -1,23 +0,0 @@
1
- class Code
2
- class Object
3
- class Nothing < ::Code::Object
4
- attr_reader :raw
5
-
6
- def initialize
7
- @raw = nil
8
- end
9
-
10
- def truthy?
11
- false
12
- end
13
-
14
- def to_s
15
- ""
16
- end
17
-
18
- def inspect
19
- "nothing"
20
- end
21
- end
22
- end
23
- end
@@ -1,6 +0,0 @@
1
- class Code
2
- class Object
3
- class Number < ::Code::Object
4
- end
5
- end
6
- end
@@ -1,146 +0,0 @@
1
- class Code
2
- class Object
3
- class Range < ::Code::Object
4
- attr_reader :raw
5
-
6
- def initialize(left, right, exclude_end: false)
7
- @left = left
8
- @right = right
9
- @exclude_end = exclude_end
10
- @raw = ::Range.new(left, right, exclude_end)
11
- end
12
-
13
- def call(**args)
14
- operator = args.fetch(:operator, nil)
15
- arguments = args.fetch(:arguments, [])
16
- globals = multi_fetch(args, *::Code::GLOBALS)
17
- value = arguments.first&.value
18
-
19
- if operator == "any?"
20
- sig(arguments) { ::Code::Object::Function }
21
- any?(value, **globals)
22
- elsif operator == "all?"
23
- sig(arguments) { ::Code::Object::Function }
24
- all?(value, **globals)
25
- elsif operator == "each"
26
- sig(arguments) { ::Code::Object::Function }
27
- each(value, **globals)
28
- elsif operator == "select"
29
- sig(arguments) { ::Code::Object::Function }
30
- select(value, **globals)
31
- elsif operator == "map"
32
- sig(arguments) { ::Code::Object::Function }
33
- map(value, **globals)
34
- elsif operator == "step"
35
- sig(arguments) { ::Code::Object::Number }
36
- step(value)
37
- elsif operator == "to_list"
38
- sig(arguments)
39
- to_list
40
- elsif operator == "first"
41
- sig(arguments)
42
- first
43
- elsif operator == "last"
44
- sig(arguments)
45
- last
46
- else
47
- super
48
- end
49
- end
50
-
51
- def to_s
52
- raw.to_s
53
- end
54
-
55
- def inspect
56
- to_s
57
- end
58
-
59
- private
60
-
61
- def any?(argument, **globals)
62
- ::Code::Object::Boolean.new(
63
- raw.any? do |element|
64
- argument.call(
65
- arguments: [::Code::Object::Argument.new(element)],
66
- **globals
67
- ).truthy?
68
- end
69
- )
70
- end
71
-
72
- def all?(argument, **globals)
73
- ::Code::Object::Boolean.new(
74
- raw.all? do |element|
75
- argument.call(
76
- arguments: [::Code::Object::Argument.new(element)],
77
- **globals
78
- ).truthy?
79
- end
80
- )
81
- end
82
-
83
- def each(argument, **globals)
84
- raw.each do |element|
85
- argument.call(
86
- arguments: [::Code::Object::Argument.new(element)],
87
- **globals
88
- )
89
- end
90
- self
91
- end
92
-
93
- def select(argument, **globals)
94
- ::Code::Object::List.new(
95
- raw.select do |element|
96
- argument.call(
97
- arguments: [::Code::Object::Argument.new(element)],
98
- **globals
99
- ).truthy?
100
- end
101
- )
102
- end
103
-
104
- def map(argument, **globals)
105
- ::Code::Object::List.new(
106
- raw.map do |element|
107
- argument.call(
108
- arguments: [::Code::Object::Argument.new(element)],
109
- **globals
110
- )
111
- end
112
- )
113
- end
114
-
115
- def step(argument)
116
- list = ::Code::Object::List.new
117
- element = @left
118
- list << element
119
-
120
- if @exlucde_end
121
- while (element = element + argument) < @right
122
- list << element
123
- end
124
- else
125
- while (element = element + argument) <= @right
126
- list << element
127
- end
128
- end
129
-
130
- list
131
- end
132
-
133
- def to_list
134
- ::Code::Object::List.new(raw.to_a)
135
- end
136
-
137
- def first
138
- raw.first
139
- end
140
-
141
- def last
142
- raw.last
143
- end
144
- end
145
- end
146
- end