code-ruby 0.13.1 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +15 -0
  3. data/.github/workflows/ci.yml +31 -0
  4. data/.rubocop.yml +8 -0
  5. data/Gemfile +2 -0
  6. data/Gemfile.lock +51 -3
  7. data/bin/bundle-audit +31 -0
  8. data/bin/bundler-audit +31 -0
  9. data/bin/console +1 -0
  10. data/bin/rspec +31 -0
  11. data/bin/rubocop +31 -0
  12. data/lib/code/error.rb +0 -3
  13. data/lib/code/node/base_10.rb +4 -3
  14. data/lib/code/node/base_16.rb +1 -0
  15. data/lib/code/node/base_2.rb +1 -0
  16. data/lib/code/node/base_8.rb +1 -0
  17. data/lib/code/node/boolean.rb +1 -0
  18. data/lib/code/node/call.rb +14 -15
  19. data/lib/code/node/call_argument.rb +4 -4
  20. data/lib/code/node/code.rb +1 -0
  21. data/lib/code/node/decimal.rb +4 -3
  22. data/lib/code/node/dictionary.rb +5 -3
  23. data/lib/code/node/function.rb +1 -0
  24. data/lib/code/node/function_parameter.rb +14 -0
  25. data/lib/code/node/if.rb +6 -4
  26. data/lib/code/node/left_operation.rb +3 -3
  27. data/lib/code/node/list.rb +1 -0
  28. data/lib/code/node/negation.rb +1 -0
  29. data/lib/code/node/not.rb +1 -0
  30. data/lib/code/node/nothing.rb +1 -0
  31. data/lib/code/node/right_operation.rb +3 -2
  32. data/lib/code/node/splat.rb +1 -0
  33. data/lib/code/node/square_bracket.rb +1 -0
  34. data/lib/code/node/string.rb +3 -0
  35. data/lib/code/node/ternary.rb +4 -3
  36. data/lib/code/node/unary_minus.rb +1 -0
  37. data/lib/code/node/while.rb +4 -3
  38. data/lib/code/object/boolean.rb +2 -2
  39. data/lib/code/object/context.rb +1 -1
  40. data/lib/code/object/decimal.rb +9 -21
  41. data/lib/code/object/dictionary.rb +43 -113
  42. data/lib/code/object/function.rb +25 -35
  43. data/lib/code/object/global.rb +33 -32
  44. data/lib/code/object/identifier_list.rb +4 -4
  45. data/lib/code/object/integer.rb +14 -23
  46. data/lib/code/object/json.rb +10 -2
  47. data/lib/code/object/list.rb +50 -23
  48. data/lib/code/object/parameter.rb +18 -10
  49. data/lib/code/object/range.rb +33 -10
  50. data/lib/code/object/string.rb +2 -2
  51. data/lib/code/object/time.rb +4 -4
  52. data/lib/code/object.rb +31 -50
  53. data/lib/code/parser/string.rb +1 -1
  54. data/lib/code/type/repeat.rb +1 -1
  55. data/lib/code/type/sig.rb +1 -3
  56. data/lib/code/version.rb +1 -1
  57. data/lib/code-ruby.rb +2 -7
  58. data/lib/code.rb +1 -3
  59. data/spec/code/object/dictionary_spec.rb +6 -6
  60. data/spec/code_spec.rb +5 -8
  61. data/yarn.lock +4 -0
  62. metadata +10 -3
  63. data/lib/code/object/argument.rb +0 -27
@@ -4,22 +4,21 @@ class Code
4
4
  class Object
5
5
  class Global < Object
6
6
  def initialize(...)
7
- super
7
+ @raw = "global"
8
8
  end
9
9
 
10
10
  def call(**args)
11
11
  operator = args.fetch(:operator, nil)
12
- arguments = args.fetch(:arguments, [])
12
+ arguments = args.fetch(:arguments, List.new)
13
13
  output = args.fetch(:output)
14
14
  context = args.fetch(:context)
15
- globals = multi_fetch(args, *GLOBALS)
16
- value = arguments.first&.value
17
- values = arguments.map(&:value)
15
+ multi_fetch(args, *GLOBALS)
16
+ value = arguments.code_first
18
17
 
19
18
  case operator.to_s
20
19
  when "Boolean"
21
20
  sig(args) { Object.repeat }
22
- value ? Boolean.new(*values) : Class.new(Boolean)
21
+ arguments.any? ? Boolean.new(*arguments.raw) : Class.new(Boolean)
23
22
  when "break"
24
23
  sig(args) { Object.repeat }
25
24
  raise Error::Break, value || Nothing.new
@@ -28,78 +27,80 @@ class Code
28
27
  raise Error::Next, value || Nothing.new
29
28
  when "Class"
30
29
  sig(args) { Object.repeat }
31
- value ? Class.new(*values) : Class.new(Class)
30
+ arguments.any? ? Class.new(*arguments.raw) : Class.new(Class)
32
31
  when "Date"
33
32
  sig(args) { Object.repeat }
34
- value ? Date.new(*values) : Class.new(Date)
33
+ arguments.any? ? Date.new(*arguments.raw) : Class.new(Date)
35
34
  when "Decimal"
36
35
  sig(args) { Object.repeat }
37
- value ? Decimal.new(*values) : Class.new(Decimal)
36
+ arguments.any? ? Decimal.new(*arguments.raw) : Class.new(Decimal)
38
37
  when "Dictionary"
39
38
  sig(args) { Object.repeat }
40
- value ? Dictionary.new(*values) : Class.new(Dictionary)
39
+ if arguments.any?
40
+ Dictionary.new(*arguments.raw)
41
+ else
42
+ Class.new(Dictionary)
43
+ end
41
44
  when "Duration"
42
45
  sig(args) { Object.repeat }
43
- value ? Duration.new(*values) : Class.new(Duration)
46
+ arguments.any? ? Duration.new(*arguments.raw) : Class.new(Duration)
44
47
  when "Function"
45
48
  sig(args)
46
- Class.new(Function)
49
+ arguments.any? ? Function.new(*arguments.raw) : Class.new(Function)
47
50
  when "Integer"
48
51
  sig(args) { Object.repeat }
49
- value ? Integer.new(*values) : Class.new(Integer)
52
+ arguments.any? ? Integer.new(*arguments.raw) : Class.new(Integer)
50
53
  when "List"
51
54
  sig(args) { Object.repeat }
52
- value ? List.new(*values) : Class.new(List)
55
+ arguments.any? ? List.new(*arguments.raw) : Class.new(List)
53
56
  when "Nothing"
54
57
  sig(args) { Object.repeat }
55
- value ? Nothing.new(*values) : Class.new(Nothing)
58
+ arguments.any? ? Nothing.new(*arguments.raw) : Class.new(Nothing)
56
59
  when "context"
57
60
  sig(args)
58
61
  context
59
62
  when "Object"
60
63
  sig(args)
61
- Class.new(Object)
64
+ arguments.any? ? Object.new(*arguments.raw) : Class.new(Object)
62
65
  when "Range"
63
66
  sig(args) { Object.repeat }
64
- value ? Range.new(*values) : Class.new(Range)
67
+ arguments.any? ? Range.new(*arguments.raw) : Class.new(Range)
65
68
  when "String"
66
69
  sig(args) { Object.repeat }
67
- value ? String.new(*values) : Class.new(String)
70
+ arguments.any? ? String.new(*arguments.raw) : Class.new(String)
68
71
  when "Time"
69
72
  sig(args) { Object.repeat }
70
- value ? Time.new(*values) : Class.new(Time)
73
+ arguments.any? ? Time.new(*arguments.raw) : Class.new(Time)
71
74
  when "Context"
72
75
  sig(args) { Object.repeat }
73
- value ? Context.new(*values) : Class.new(Context)
76
+ arguments.any? ? Context.new(*arguments.raw) : Class.new(Context)
74
77
  when "Code"
75
78
  sig(args) { Object.repeat }
76
- value ? Code.new(*values) : Class.new(Code)
77
- when "Argument"
78
- sig(args) { Object.repeat }
79
- value ? Argument.new(*values) : Class.new(Argument)
79
+ arguments.any? ? Code.new(*arguments.raw) : Class.new(Code)
80
80
  when "Parameter"
81
81
  sig(args) { Object.repeat }
82
- value ? Parameter.new(*values) : Class.new(Parameter)
83
- when "Range"
84
- sig(args) { Object.repeat }
85
- value ? Range.new(*values) : Class.new(Range)
82
+ arguments.any? ? Parameter.new(*arguments.raw) : Class.new(Parameter)
86
83
  when "IdentifierList"
87
84
  sig(args) { Object.repeat }
88
- value ? IdentifierList.new(*values) : Class.new(IdentifierList)
85
+ if arguments.any?
86
+ IdentifierList.new(*arguments.raw)
87
+ else
88
+ Class.new(IdentifierList)
89
+ end
89
90
  when "evaluate"
90
91
  sig(args) { Object }
91
92
  Code.evaluate(value.to_s)
92
93
  when "p"
93
94
  sig(args) { Object.repeat }
94
- output.puts(*arguments.map(&:value).map(&:inspect))
95
+ output.puts(*arguments.raw.map(&:inspect))
95
96
  Nothing.new
96
97
  when "print"
97
98
  sig(args) { Object.repeat }
98
- output.print(*arguments.map(&:value))
99
+ output.print(*arguments.raw)
99
100
  Nothing.new
100
101
  when "puts"
101
102
  sig(args) { Object.repeat }
102
- output.puts(*arguments.map(&:value))
103
+ output.puts(*arguments.raw)
103
104
  Nothing.new
104
105
  else
105
106
  context = context.lookup!(operator)
@@ -5,9 +5,9 @@ class Code
5
5
  class IdentifierList < List
6
6
  def call(**args)
7
7
  operator = args.fetch(:operator, nil)
8
- arguments = args.fetch(:arguments, [])
8
+ arguments = args.fetch(:arguments, List.new)
9
9
  context = args.fetch(:context)
10
- value = arguments.first&.value
10
+ value = arguments.code_first
11
11
 
12
12
  case operator.to_s
13
13
  when /=$/
@@ -27,8 +27,8 @@ class Code
27
27
  else
28
28
  context.fetch(raw.last).call(
29
29
  **args,
30
- operator: operator[..-2],
31
- arguments: [Argument.new(value)]
30
+ operator: operator.chop,
31
+ arguments: List.new([value])
32
32
  )
33
33
  end
34
34
  )
@@ -9,15 +9,15 @@ class Code
9
9
  whole = whole.raw if whole.is_an?(Object)
10
10
  exponent = exponent.raw if exponent.is_an?(Object)
11
11
  @raw = whole.to_i * 10**exponent
12
- rescue FloatDomainError => e
12
+ rescue FloatDomainError
13
13
  raise Error, "#{decimal.inspect} * 10**#{exponent.inspect} is invalid"
14
14
  end
15
15
 
16
16
  def call(**args)
17
17
  operator = args.fetch(:operator, nil)
18
- arguments = args.fetch(:arguments, [])
18
+ arguments = args.fetch(:arguments, List.new)
19
19
  globals = multi_fetch(args, *GLOBALS)
20
- value = arguments.first&.value
20
+ value = arguments.code_first
21
21
 
22
22
  case operator.to_s
23
23
  when "%", "modulo"
@@ -34,10 +34,10 @@ class Code
34
34
  code_power(value)
35
35
  when "+", "plus", "self"
36
36
  sig(args) { Object.maybe }
37
- value ? code_plus(value) : code_self
37
+ arguments.any? ? code_plus(value) : code_self
38
38
  when "-", "minus", "unary_minus"
39
39
  sig(args) { Integer | Decimal.maybe }
40
- value ? code_minus(value) : code_unary_minus
40
+ arguments.any? ? code_minus(value) : code_unary_minus
41
41
  when "/", "division", "÷"
42
42
  sig(args) { Integer | Decimal }
43
43
  code_division(value)
@@ -137,15 +137,6 @@ class Code
137
137
  when "times"
138
138
  sig(args) { Function }
139
139
  code_times(value, **globals)
140
- when "to_decimal"
141
- sig(args)
142
- code_to_decimal
143
- when "to_integer"
144
- sig(args)
145
- code_to_integer
146
- when "to_string"
147
- sig(args)
148
- code_to_string
149
140
  when "truncate"
150
141
  sig(args) { Integer.maybe }
151
142
  code_truncate(value)
@@ -180,7 +171,7 @@ class Code
180
171
  end
181
172
 
182
173
  def code_ceil(n = nil)
183
- n ||= Integer.new(0)
174
+ n = Integer.new(0) if n.nil? || n.is_a?(Nothing)
184
175
  Integer.new(raw.ceil(n.raw))
185
176
  end
186
177
 
@@ -193,13 +184,13 @@ class Code
193
184
  end
194
185
 
195
186
  def code_decrement!(n = nil)
196
- n ||= Integer.new(1)
187
+ n = Integer.new(1) if n.nil? || n.is_a?(Nothing)
197
188
  @raw -= n.raw
198
189
  self
199
190
  end
200
191
 
201
192
  def code_decrement(n = nil)
202
- n ||= Integer.new(1)
193
+ n = Integer.new(1) if n.nil? || n.is_a?(Nothing)
203
194
  Integer.new(raw - n.raw)
204
195
  end
205
196
 
@@ -220,7 +211,7 @@ class Code
220
211
  end
221
212
 
222
213
  def code_floor(n = nil)
223
- n ||= Integer.new(0)
214
+ n = Integer.new(0) if n.nil? || n.is_a?(Nothing)
224
215
  Integer.new(raw.floor(n.raw))
225
216
  end
226
217
 
@@ -229,13 +220,13 @@ class Code
229
220
  end
230
221
 
231
222
  def code_increment!(n = nil)
232
- n ||= Integer.new(1)
223
+ n = Integer.new(1) if n.nil? || n.is_a?(Nothing)
233
224
  @raw += n.raw
234
225
  self
235
226
  end
236
227
 
237
228
  def code_increment(n = nil)
238
- n ||= Integer.new(1)
229
+ n = Integer.new(1) if n.nil? || n.is_a?(Nothing)
239
230
  Integer.new(raw + n.raw)
240
231
  end
241
232
 
@@ -312,7 +303,7 @@ class Code
312
303
  end
313
304
 
314
305
  def code_round(n = nil)
315
- n ||= Integer.new(0)
306
+ n = Integer.new(0) if n.nil? || n.is_a?(Nothing)
316
307
  Integer.new(raw.round(n.raw))
317
308
  end
318
309
 
@@ -355,7 +346,7 @@ class Code
355
346
  def code_times(argument, **globals)
356
347
  raw.times do |element|
357
348
  argument.call(
358
- arguments: [Argument.new(Integer.new(element))],
349
+ arguments: List.new([Integer.new(element), self]),
359
350
  **globals
360
351
  )
361
352
  end
@@ -364,7 +355,7 @@ class Code
364
355
  end
365
356
 
366
357
  def code_truncate(n = nil)
367
- n ||= Integer.new(0)
358
+ n = Integer.new(0) if n.nil? || n.is_a?(Nothing)
368
359
  Integer.new(raw.truncate(n.raw))
369
360
  end
370
361
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Code
2
4
  class Object
3
5
  class Json < Object
@@ -5,9 +7,15 @@ class Code
5
7
  if json.is_an?(Object)
6
8
  json
7
9
  elsif json.is_a?(::Hash)
8
- Dictionary.new(json)
10
+ Dictionary.new(
11
+ json.transform_keys do |key|
12
+ Json.to_code(key)
13
+ end.transform_values do |value|
14
+ Json.to_code(value)
15
+ end
16
+ )
9
17
  elsif json.is_a?(::Array)
10
- List.new(json)
18
+ List.new(json.map { |element| Json.to_code(element) })
11
19
  elsif json.is_a?(::String)
12
20
  String.new(json)
13
21
  elsif json.is_a?(::Float)
@@ -4,16 +4,16 @@ class Code
4
4
  class Object
5
5
  class List < Object
6
6
  def initialize(*args, **_kargs, &_block)
7
- raw = args.first || Nothing.new
7
+ raw = args.first
8
8
  raw = raw.raw if raw.is_an?(Object)
9
9
  @raw = raw.to_a
10
10
  end
11
11
 
12
12
  def call(**args)
13
13
  operator = args.fetch(:operator, nil)
14
- arguments = args.fetch(:arguments, [])
14
+ arguments = args.fetch(:arguments, List.new)
15
15
  globals = multi_fetch(args, *GLOBALS)
16
- value = arguments.first&.value
16
+ value = arguments.code_first
17
17
 
18
18
  case operator.to_s
19
19
  when "sort"
@@ -83,8 +83,11 @@ class Code
83
83
 
84
84
  def code_any?(argument, **globals)
85
85
  Boolean.new(
86
- raw.any? do |element|
87
- argument.call(arguments: [Argument.new(element)], **globals).truthy?
86
+ raw.any?.with_index do |element, index|
87
+ argument.call(
88
+ arguments: List.new([element, Integer.new(index), self]),
89
+ **globals
90
+ ).truthy?
88
91
  rescue Error::Next => e
89
92
  e.value || Nothing.new
90
93
  end
@@ -97,16 +100,22 @@ class Code
97
100
  end
98
101
 
99
102
  def code_detect(argument, **globals)
100
- raw.detect do |element|
101
- argument.call(arguments: [Argument.new(element)], **globals).truthy?
103
+ raw.detect.with_index do |element, index|
104
+ argument.call(
105
+ arguments: List.new([element, Integer.new(index), self]),
106
+ **globals
107
+ ).truthy?
102
108
  rescue Error::Next => e
103
109
  e.value || Nothing.new
104
110
  end || Nothing.new
105
111
  end
106
112
 
107
113
  def code_each(argument, **globals)
108
- raw.each do |element|
109
- argument.call(arguments: [Argument.new(element)], **globals)
114
+ raw.each.with_index do |element, index|
115
+ argument.call(
116
+ arguments: List.new([element, Integer.new(index), self]),
117
+ **globals
118
+ )
110
119
  rescue Error::Next => e
111
120
  e.value || Nothing.new
112
121
  end
@@ -118,7 +127,7 @@ class Code
118
127
  end
119
128
 
120
129
  def code_flatten(level = nil)
121
- level ||= Integer.new(-1)
130
+ level = Integer.new(-1) if level.nil? || level.is_a?(Nothing)
122
131
  level = level.raw if level.is_a?(Integer)
123
132
 
124
133
  List.new(
@@ -148,8 +157,11 @@ class Code
148
157
 
149
158
  def code_map(argument, **globals)
150
159
  List.new(
151
- raw.map do |element|
152
- argument.call(arguments: [Argument.new(element)], **globals)
160
+ raw.map.with_index do |element, index|
161
+ argument.call(
162
+ arguments: List.new([element, Integer.new(index), self]),
163
+ **globals
164
+ )
153
165
  rescue Error::Next => e
154
166
  e.value || Nothing.new
155
167
  end
@@ -161,8 +173,11 @@ class Code
161
173
  end
162
174
 
163
175
  def code_max_by(argument, **globals)
164
- raw.max_by do |element|
165
- argument.call(arguments: [Argument.new(element)], **globals)
176
+ raw.max_by.with_index do |element, index|
177
+ argument.call(
178
+ arguments: List.new([element, Integer.new(index), self]),
179
+ **globals
180
+ )
166
181
  rescue Error::Next => e
167
182
  e.value || Nothing.new
168
183
  end || Nothing.new
@@ -170,8 +185,11 @@ class Code
170
185
 
171
186
  def code_none?(argument, **globals)
172
187
  Boolean.new(
173
- raw.none? do |element|
174
- argument.call(arguments: [Argument.new(element)], **globals).truthy?
188
+ raw.none?.with_index do |element, index|
189
+ argument.call(
190
+ arguments: List.new([element, Integer.new(index), self]),
191
+ **globals
192
+ ).truthy?
175
193
  rescue Error::Next => e
176
194
  (e.value || Nothing.new).truthy?
177
195
  end
@@ -179,9 +197,9 @@ class Code
179
197
  end
180
198
 
181
199
  def code_reduce(argument, **globals)
182
- raw.reduce do |acc, element|
200
+ raw.reduce.with_index do |acc, element, index|
183
201
  argument.call(
184
- arguments: [Argument.new(acc), Argument.new(element)],
202
+ arguments: List.new([acc, element, Integer.new(index), self]),
185
203
  **globals
186
204
  )
187
205
  rescue Error::Next => e
@@ -195,8 +213,11 @@ class Code
195
213
 
196
214
  def code_select(argument, **globals)
197
215
  List.new(
198
- raw.select do |element|
199
- argument.call(arguments: [Argument.new(element)], **globals).truthy?
216
+ raw.select.with_index do |element, index|
217
+ argument.call(
218
+ arguments: List.new([element, Integer.new(index), self]),
219
+ **globals
220
+ ).truthy?
200
221
  rescue Error::Next => e
201
222
  (e.value || Nothing.new).truthy?
202
223
  end
@@ -204,10 +225,12 @@ class Code
204
225
  end
205
226
 
206
227
  def code_select!(argument, **globals)
207
- raw.select! do |element|
208
- argument.call(arguments: [Argument.new(element)], **globals).truthy?
228
+ raw.select!.with_index do |element, index|
229
+ argument.call(
230
+ arguments: List.new([element, Integer.new(index), self]),
231
+ **globals
232
+ ).truthy?
209
233
  rescue Error::Next => e
210
- p e.value
211
234
  (e.value || Nothing.new).truthy?
212
235
  end
213
236
 
@@ -229,6 +252,10 @@ class Code
229
252
  def code_sum
230
253
  raw.inject(&:code_plus) || Nothing.new
231
254
  end
255
+
256
+ def any?
257
+ raw.any?
258
+ end
232
259
  end
233
260
  end
234
261
  end
@@ -11,16 +11,24 @@ class Code
11
11
  String.new(raw.code_get(String.new(:name)))
12
12
  end
13
13
 
14
- def code_keyword
15
- Boolean.new(raw.code_get(String.new(:keyword)))
14
+ def code_regular?
15
+ Boolean.new(raw.code_get(String.new(:regular?)))
16
16
  end
17
17
 
18
- def code_regular_splat
19
- Boolean.new(raw.code_get(String.new(:regular_splat)))
18
+ def code_keyword?
19
+ Boolean.new(raw.code_get(String.new(:keyword?)))
20
20
  end
21
21
 
22
- def code_keyword_splat
23
- Boolean.new(raw.code_get(String.new(:keyword_splat)))
22
+ def code_keyword?
23
+ Boolean.new(raw.code_get(String.new(:keyword?)))
24
+ end
25
+
26
+ def code_regular_splat?
27
+ Boolean.new(raw.code_get(String.new(:regular_splat?)))
28
+ end
29
+
30
+ def code_keyword_splat?
31
+ Boolean.new(raw.code_get(String.new(:keyword_splat?)))
24
32
  end
25
33
 
26
34
  def code_default
@@ -32,19 +40,19 @@ class Code
32
40
  end
33
41
 
34
42
  def regular?
35
- !keyword?
43
+ code_regular?.truthy?
36
44
  end
37
45
 
38
46
  def keyword?
39
- code_keyword.truthy?
47
+ code_keyword?.truthy?
40
48
  end
41
49
 
42
50
  def regular_splat?
43
- code_regular_splat.truthy?
51
+ code_regular_splat?.truthy?
44
52
  end
45
53
 
46
54
  def keyword_splat?
47
- code_keyword_splat.truthy?
55
+ code_keyword_splat?.truthy?
48
56
  end
49
57
  end
50
58
  end
@@ -15,9 +15,9 @@ class Code
15
15
 
16
16
  def call(**args)
17
17
  operator = args.fetch(:operator, nil)
18
- arguments = args.fetch(:arguments, [])
18
+ arguments = args.fetch(:arguments, List.new)
19
19
  globals = multi_fetch(args, *GLOBALS)
20
- value = arguments.first&.value
20
+ value = arguments.code_first
21
21
 
22
22
  case operator.to_s
23
23
  when "all?"
@@ -53,24 +53,41 @@ class Code
53
53
  end
54
54
 
55
55
  def code_all?(argument, **globals)
56
+ index = 0
56
57
  Boolean.new(
57
58
  raw.all? do |element|
58
- argument.call(arguments: [Argument.new(element)], **globals).truthy?
59
+ argument
60
+ .call(
61
+ arguments: List.new([element, Integer.new(index), self]),
62
+ **globals
63
+ )
64
+ .truthy?
65
+ .tap { index += 1 }
59
66
  end
60
67
  )
61
68
  end
62
69
 
63
70
  def code_any?(argument, **globals)
71
+ index = 0
64
72
  Boolean.new(
65
73
  raw.any? do |element|
66
- argument.call(arguments: [Argument.new(element)], **globals).truthy?
74
+ argument
75
+ .call(
76
+ arguments: List.new([element, Integer.new(index), self]),
77
+ **globals
78
+ )
79
+ .truthy?
80
+ .tap { index += 1 }
67
81
  end
68
82
  )
69
83
  end
70
84
 
71
85
  def code_each(argument, **globals)
72
- raw.each do |element|
73
- argument.call(arguments: [Argument.new(element)], **globals)
86
+ raw.each.with_index do |element, index|
87
+ argument.call(
88
+ arguments: List.new([element, Integer.new(index), self]),
89
+ **globals
90
+ )
74
91
  end
75
92
  self
76
93
  end
@@ -85,16 +102,22 @@ class Code
85
102
 
86
103
  def code_map(argument, **globals)
87
104
  List.new(
88
- raw.map do |element|
89
- argument.call(arguments: [Argument.new(element)], **globals)
105
+ raw.map.with_index do |element, index|
106
+ argument.call(
107
+ arguments: List.new([element, Integer.new(index), self]),
108
+ **globals
109
+ )
90
110
  end
91
111
  )
92
112
  end
93
113
 
94
114
  def code_select(argument, **globals)
95
115
  List.new(
96
- raw.select do |element|
97
- argument.call(arguments: [Argument.new(element)], **globals).truthy?
116
+ raw.select.with_index do |element, index|
117
+ argument.call(
118
+ arguments: List.new([element, Integer.new(index), self]),
119
+ **globals
120
+ ).truthy?
98
121
  end
99
122
  )
100
123
  end
@@ -11,9 +11,9 @@ class Code
11
11
 
12
12
  def call(**args)
13
13
  operator = args.fetch(:operator, nil)
14
- arguments = args.fetch(:arguments, [])
14
+ arguments = args.fetch(:arguments, List.new)
15
15
  globals = multi_fetch(args, *GLOBALS)
16
- value = arguments.first&.value
16
+ value = arguments.code_first
17
17
 
18
18
  case operator.to_s
19
19
  when "&", "to_function"
@@ -47,8 +47,8 @@ class Code
47
47
 
48
48
  def call(**args)
49
49
  operator = args.fetch(:operator, nil)
50
- arguments = args.fetch(:arguments, [])
51
- value = arguments.first&.value
50
+ arguments = args.fetch(:arguments, List.new)
51
+ value = arguments.code_first
52
52
 
53
53
  case operator.to_s
54
54
  when "after?"
@@ -69,12 +69,12 @@ class Code
69
69
  end
70
70
 
71
71
  def code_after?(other = nil)
72
- other ||= Time.code_now
72
+ other = Time.code_now if other.nil? || other.is_a?(Nothing)
73
73
  Boolean.new(raw.after?(other.raw))
74
74
  end
75
75
 
76
76
  def code_before?(other = nil)
77
- other ||= Time.code_now
77
+ other = Time.code_now if other.nil? || other.is_a?(Nothing)
78
78
  Boolean.new(raw.before?(other.raw))
79
79
  end
80
80