language-ruby 0.5.6 → 0.6.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 (194) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -4
  3. data/language-ruby.gemspec +3 -3
  4. data/lib/language/atom/any.rb +8 -0
  5. data/lib/language/atom/repeat.rb +15 -0
  6. data/lib/language/atom.rb +25 -42
  7. data/lib/language/output.rb +13 -11
  8. data/lib/language/parser/absent/present.rb +2 -0
  9. data/lib/language/parser/absent.rb +2 -0
  10. data/lib/language/parser/end_of_input.rb +2 -0
  11. data/lib/language/parser/interuption.rb +2 -0
  12. data/lib/language/parser/not_end_of_input.rb +2 -0
  13. data/lib/language/parser/str/not_found.rb +2 -0
  14. data/lib/language/parser/str.rb +2 -0
  15. data/lib/language/parser.rb +10 -10
  16. data/lib/language/version.rb +3 -0
  17. data/lib/language-ruby.rb +0 -5
  18. data/lib/language.rb +9 -7
  19. data/spec/spec_helper.rb +1 -6
  20. metadata +7 -221
  21. data/.cherry.js +0 -21
  22. data/.editorconfig +0 -9
  23. data/.github/workflows/rspec.yml +0 -14
  24. data/.gitignore +0 -2
  25. data/.prettierrc +0 -3
  26. data/.rspec +0 -1
  27. data/.tool-versions +0 -1
  28. data/CHANGELOG.md +0 -55
  29. data/Gemfile.lock +0 -49
  30. data/LICENSE +0 -7
  31. data/README.md +0 -103
  32. data/TODO +0 -17
  33. data/bin/code +0 -76
  34. data/bin/format +0 -3
  35. data/bin/publish +0 -19
  36. data/bin/template +0 -85
  37. data/bin/test +0 -17
  38. data/code-ruby.gemspec +0 -17
  39. data/docs/class.code +0 -9
  40. data/docs/euler/1.template +0 -10
  41. data/docs/euler/2.template +0 -16
  42. data/docs/euler/3.template +0 -16
  43. data/docs/euler/4.template +0 -10
  44. data/docs/euler/5.template +0 -13
  45. data/docs/fibonnaci.template +0 -14
  46. data/docs/meetup.code +0 -12
  47. data/docs/precedence.template +0 -36
  48. data/docs/rain.code +0 -22
  49. data/docs/slack.code +0 -17
  50. data/docs/stripe.code +0 -7
  51. data/docs/twitter.code +0 -9
  52. data/lib/code/error.rb +0 -18
  53. data/lib/code/node/base_10.rb +0 -29
  54. data/lib/code/node/base_16.rb +0 -13
  55. data/lib/code/node/base_2.rb +0 -13
  56. data/lib/code/node/base_8.rb +0 -13
  57. data/lib/code/node/boolean.rb +0 -22
  58. data/lib/code/node/call.rb +0 -47
  59. data/lib/code/node/call_argument.rb +0 -21
  60. data/lib/code/node/chained_call.rb +0 -23
  61. data/lib/code/node/code.rb +0 -20
  62. data/lib/code/node/decimal.rb +0 -26
  63. data/lib/code/node/dictionnary.rb +0 -33
  64. data/lib/code/node/equal.rb +0 -34
  65. data/lib/code/node/function.rb +0 -20
  66. data/lib/code/node/function_parameter.rb +0 -31
  67. data/lib/code/node/if.rb +0 -59
  68. data/lib/code/node/if_modifier.rb +0 -47
  69. data/lib/code/node/list.rb +0 -16
  70. data/lib/code/node/negation.rb +0 -15
  71. data/lib/code/node/not.rb +0 -15
  72. data/lib/code/node/nothing.rb +0 -12
  73. data/lib/code/node/number.rb +0 -25
  74. data/lib/code/node/operation.rb +0 -38
  75. data/lib/code/node/power.rb +0 -20
  76. data/lib/code/node/rescue.rb +0 -17
  77. data/lib/code/node/splat.rb +0 -15
  78. data/lib/code/node/statement.rb +0 -59
  79. data/lib/code/node/string.rb +0 -53
  80. data/lib/code/node/ternary.rb +0 -24
  81. data/lib/code/node/unary_minus.rb +0 -15
  82. data/lib/code/node/while.rb +0 -35
  83. data/lib/code/node.rb +0 -13
  84. data/lib/code/object/argument.rb +0 -32
  85. data/lib/code/object/boolean.rb +0 -27
  86. data/lib/code/object/decimal.rb +0 -162
  87. data/lib/code/object/dictionnary.rb +0 -96
  88. data/lib/code/object/function.rb +0 -64
  89. data/lib/code/object/global.rb +0 -42
  90. data/lib/code/object/integer.rb +0 -221
  91. data/lib/code/object/list.rb +0 -207
  92. data/lib/code/object/nothing.rb +0 -23
  93. data/lib/code/object/number.rb +0 -6
  94. data/lib/code/object/range.rb +0 -146
  95. data/lib/code/object/ruby_function.rb +0 -31
  96. data/lib/code/object/string.rb +0 -102
  97. data/lib/code/object.rb +0 -197
  98. data/lib/code/parser/addition.rb +0 -21
  99. data/lib/code/parser/and_operator.rb +0 -17
  100. data/lib/code/parser/bitwise_and.rb +0 -17
  101. data/lib/code/parser/bitwise_or.rb +0 -21
  102. data/lib/code/parser/boolean.rb +0 -17
  103. data/lib/code/parser/call.rb +0 -122
  104. data/lib/code/parser/chained_call.rb +0 -47
  105. data/lib/code/parser/class.rb +0 -45
  106. data/lib/code/parser/code.rb +0 -25
  107. data/lib/code/parser/dictionnary.rb +0 -67
  108. data/lib/code/parser/equal.rb +0 -94
  109. data/lib/code/parser/equality.rb +0 -35
  110. data/lib/code/parser/equality_lower.rb +0 -9
  111. data/lib/code/parser/function.rb +0 -85
  112. data/lib/code/parser/greater.rb +0 -25
  113. data/lib/code/parser/group.rb +0 -22
  114. data/lib/code/parser/if.rb +0 -63
  115. data/lib/code/parser/if_modifier.rb +0 -55
  116. data/lib/code/parser/list.rb +0 -42
  117. data/lib/code/parser/multiplication.rb +0 -25
  118. data/lib/code/parser/name.rb +0 -107
  119. data/lib/code/parser/negation.rb +0 -30
  120. data/lib/code/parser/not_keyword.rb +0 -23
  121. data/lib/code/parser/nothing.rb +0 -22
  122. data/lib/code/parser/number.rb +0 -154
  123. data/lib/code/parser/operation.rb +0 -35
  124. data/lib/code/parser/or_keyword.rb +0 -21
  125. data/lib/code/parser/or_operator.rb +0 -17
  126. data/lib/code/parser/power.rb +0 -43
  127. data/lib/code/parser/range.rb +0 -17
  128. data/lib/code/parser/rescue.rb +0 -39
  129. data/lib/code/parser/shift.rb +0 -21
  130. data/lib/code/parser/splat.rb +0 -31
  131. data/lib/code/parser/statement.rb +0 -9
  132. data/lib/code/parser/string.rb +0 -78
  133. data/lib/code/parser/ternary.rb +0 -46
  134. data/lib/code/parser/unary_minus.rb +0 -31
  135. data/lib/code/parser/while.rb +0 -36
  136. data/lib/code/parser/whitespace.rb +0 -49
  137. data/lib/code/parser.rb +0 -19
  138. data/lib/code/ruby.rb +0 -174
  139. data/lib/code-ruby.rb +0 -10
  140. data/lib/code.rb +0 -47
  141. data/lib/template/node/code_part.rb +0 -13
  142. data/lib/template/node/part.rb +0 -19
  143. data/lib/template/node/template.rb +0 -15
  144. data/lib/template/node/text_part.rb +0 -13
  145. data/lib/template/node.rb +0 -4
  146. data/lib/template/parser/template.rb +0 -39
  147. data/lib/template/parser.rb +0 -19
  148. data/lib/template/version.rb +0 -3
  149. data/lib/template-ruby.rb +0 -10
  150. data/lib/template.rb +0 -50
  151. data/spec/code/addition_spec.rb +0 -13
  152. data/spec/code/and_operator_spec.rb +0 -13
  153. data/spec/code/bitwise_and_spec.rb +0 -13
  154. data/spec/code/bitwise_or_spec.rb +0 -13
  155. data/spec/code/boolean_spec.rb +0 -13
  156. data/spec/code/call_spec.rb +0 -21
  157. data/spec/code/chained_call_spec.rb +0 -16
  158. data/spec/code/code_spec.rb +0 -29
  159. data/spec/code/dictionnary_spec.rb +0 -17
  160. data/spec/code/equal_spec.rb +0 -26
  161. data/spec/code/equality_spec.rb +0 -13
  162. data/spec/code/function_spec.rb +0 -18
  163. data/spec/code/greater_spec.rb +0 -18
  164. data/spec/code/group_spec.rb +0 -12
  165. data/spec/code/if_modifier_spec.rb +0 -20
  166. data/spec/code/if_spec.rb +0 -25
  167. data/spec/code/list_spec.rb +0 -19
  168. data/spec/code/multiplication_spec.rb +0 -18
  169. data/spec/code/negation_spec.rb +0 -20
  170. data/spec/code/not_keyword_spec.rb +0 -13
  171. data/spec/code/nothing_spec.rb +0 -17
  172. data/spec/code/number_spec.rb +0 -22
  173. data/spec/code/or_keyword_spec.rb +0 -17
  174. data/spec/code/or_operator_spec.rb +0 -16
  175. data/spec/code/parser/boolean_spec.rb +0 -16
  176. data/spec/code/parser/call_spec.rb +0 -26
  177. data/spec/code/parser/chained_call.rb +0 -17
  178. data/spec/code/parser/dictionnary_spec.rb +0 -18
  179. data/spec/code/parser/function_spec.rb +0 -16
  180. data/spec/code/parser/group_spec.rb +0 -18
  181. data/spec/code/parser/list_spec.rb +0 -18
  182. data/spec/code/parser/number_spec.rb +0 -12
  183. data/spec/code/parser/string_spec.rb +0 -21
  184. data/spec/code/parser_spec.rb +0 -23
  185. data/spec/code/power_spec.rb +0 -13
  186. data/spec/code/range_spec.rb +0 -16
  187. data/spec/code/rescue_spec.rb +0 -13
  188. data/spec/code/shift_spec.rb +0 -13
  189. data/spec/code/splat_spec.rb +0 -13
  190. data/spec/code/string_spec.rb +0 -27
  191. data/spec/code/ternary_spec.rb +0 -18
  192. data/spec/code/unary_minus_spec.rb +0 -13
  193. data/spec/code/while_spec.rb +0 -18
  194. data/template-ruby.gemspec +0 -19
@@ -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
@@ -1,31 +0,0 @@
1
- class Code
2
- class Object
3
- class RubyFunction < ::Code::Object::Function
4
- attr_reader :raw
5
-
6
- def initialize(raw)
7
- @raw = raw
8
- end
9
-
10
- private
11
-
12
- def call_function(args:, globals:)
13
- regular_arguments =
14
- args
15
- .select(&:regular?)
16
- .map(&:value)
17
- .map { |argument| ::Code::Ruby.from_code(argument) }
18
-
19
- keyword_arguments =
20
- args
21
- .select(&:keyword?)
22
- .map do |argument|
23
- [argument.name.to_sym, ::Code::Ruby.from_code(argument.value)]
24
- end
25
- .to_h
26
-
27
- ::Code::Ruby.to_code(raw.call(*regular_arguments, **keyword_arguments))
28
- end
29
- end
30
- end
31
- end
@@ -1,102 +0,0 @@
1
- class Code
2
- class Object
3
- class String < ::Code::Object
4
- attr_reader :raw
5
-
6
- def initialize(string)
7
- @raw = string
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 == "&" || operator == "to_function"
17
- sig(arguments)
18
- to_function(**globals)
19
- elsif operator == "+"
20
- sig(arguments) { ::Code::Object }
21
- plus(value)
22
- elsif operator == "*"
23
- sig(arguments) { ::Code::Object::Number }
24
- multiplication(value)
25
- elsif operator == "reverse"
26
- sig(arguments)
27
- reverse
28
- elsif operator == "downcase"
29
- sig(arguments)
30
- downcase
31
- elsif operator == "include?"
32
- sig(arguments) { ::Code::Object::String }
33
- include?(value)
34
- else
35
- super
36
- end
37
- end
38
-
39
- def succ
40
- ::Code::Object::String.new(raw.succ)
41
- end
42
-
43
- def to_sym
44
- raw.to_sym
45
- end
46
-
47
- def to_s
48
- raw
49
- end
50
-
51
- def inspect
52
- raw.inspect
53
- end
54
-
55
- private
56
-
57
- def to_function(**globals)
58
- ::Code::Node::Code.new(
59
- [
60
- {
61
- function: {
62
- parameters: [{ name: "_" }],
63
- body: [
64
- {
65
- chained_call: {
66
- first: {
67
- call: {
68
- name: "_"
69
- }
70
- },
71
- others: [{ call: { name: raw } }]
72
- }
73
- }
74
- ]
75
- }
76
- }
77
- ]
78
- ).evaluate(**globals)
79
- end
80
-
81
- def plus(other)
82
- ::Code::Object::String.new(raw + other.to_s)
83
- end
84
-
85
- def multiplication(other)
86
- ::Code::Object::String.new(raw * other.raw)
87
- end
88
-
89
- def reverse
90
- ::Code::Object::String.new(raw.reverse)
91
- end
92
-
93
- def downcase
94
- ::Code::Object::String.new(raw.downcase)
95
- end
96
-
97
- def include?(value)
98
- ::Code::Object::Boolean.new(raw.include?(value.raw))
99
- end
100
- end
101
- end
102
- end
data/lib/code/object.rb DELETED
@@ -1,197 +0,0 @@
1
- class Code
2
- class Object
3
- include Comparable
4
-
5
- def call(**args)
6
- operator = args.fetch(:operator, nil)
7
- arguments = args.fetch(:arguments, [])
8
- value = arguments.first&.value
9
-
10
- if operator == "=="
11
- sig(arguments) { ::Code::Object }
12
- equal(value)
13
- elsif operator == "==="
14
- sig(arguments) { ::Code::Object }
15
- strict_equal(value)
16
- elsif operator == "!="
17
- sig(arguments) { ::Code::Object }
18
- different(value)
19
- elsif operator == "<=>"
20
- sig(arguments) { ::Code::Object }
21
- compare(value)
22
- elsif operator == "&&" || operator == "and"
23
- sig(arguments) { ::Code::Object }
24
- and_operator(value)
25
- elsif operator == "||" || operator == "or"
26
- sig(arguments) { ::Code::Object }
27
- or_operator(value)
28
- elsif operator == "!" || operator == "not"
29
- sig(arguments)
30
- exclamation_point
31
- elsif operator == "+"
32
- sig(arguments)
33
- self
34
- elsif operator == ".."
35
- sig(arguments) { ::Code::Object }
36
- inclusive_range(value)
37
- elsif operator == "..."
38
- sig(arguments) { ::Code::Object }
39
- exclusive_range(value)
40
- elsif operator == "to_string"
41
- sig(arguments)
42
- to_string
43
- else
44
- raise(
45
- Code::Error::Undefined.new("#{operator} not defined on #{inspect}")
46
- )
47
- end
48
- end
49
-
50
- def truthy?
51
- true
52
- end
53
-
54
- def falsy?
55
- !truthy?
56
- end
57
-
58
- def <=>(other)
59
- if respond_to?(:raw)
60
- other.respond_to?(:raw) ? raw <=> other.raw : raw <=> other
61
- else
62
- other <=> self
63
- end
64
- end
65
-
66
- def ==(other)
67
- if respond_to?(:raw)
68
- other.respond_to?(:raw) ? raw == other.raw : raw == other
69
- else
70
- other == self
71
- end
72
- end
73
- alias_method :eql?, :==
74
-
75
- def hash
76
- if respond_to?(:raw)
77
- [self.class, raw].hash
78
- else
79
- raise NotImplementedError.new(self.class.name)
80
- end
81
- end
82
-
83
- def to_s
84
- raise NotImplementedError.new(self.class.name)
85
- end
86
-
87
- private
88
-
89
- def multi_fetch(hash, *keys)
90
- keys.map { |key| [key, hash.fetch(key)] }.to_h
91
- end
92
-
93
- def deep_dup(object)
94
- if object.is_a?(Array)
95
- object.map { |element| deep_dup(element) }
96
- elsif object.is_a?(Hash)
97
- object.map { |key, value| [deep_dup(key), deep_dup(value)] }.to_h
98
- elsif object.is_a?(::Code::Object::List)
99
- ::Code::Object::List.new(object.raw.map { |element| deep_dup(element) })
100
- elsif object.is_a?(::Code::Object::Dictionnary)
101
- ::Code::Object::Dictionnary.new(
102
- object.raw.map { |key, value| [deep_dup(key), deep_dup(value)] }.to_h
103
- )
104
- else
105
- object.dup
106
- end
107
- end
108
-
109
- def sig(actual_arguments, &block)
110
- if block
111
- expected_arguments = block.call
112
- expected_arguments = [
113
- expected_arguments
114
- ] unless expected_arguments.is_a?(Array)
115
- else
116
- expected_arguments = []
117
- end
118
-
119
- if actual_arguments.size != expected_arguments.size
120
- raise(
121
- ::Code::Error::ArgumentError.new(
122
- "Expected #{expected_arguments.size} arguments, " \
123
- "got #{actual_arguments.size} arguments"
124
- )
125
- )
126
- end
127
-
128
- expected_arguments.each.with_index do |expected_argument, index|
129
- actual_argument = actual_arguments[index].value
130
-
131
- if expected_argument.is_a?(Array)
132
- if expected_argument.none? { |expected_arg|
133
- actual_argument.is_a?(expected_arg)
134
- }
135
- raise(
136
- ::Code::Error::TypeError.new(
137
- "Expected #{expected_argument}, got #{actual_argument.class}"
138
- )
139
- )
140
- end
141
- else
142
- if !actual_argument.is_a?(expected_argument)
143
- raise(
144
- ::Code::Error::TypeError.new(
145
- "Expected #{expected_argument}, got #{actual_argument.class}"
146
- )
147
- )
148
- end
149
- end
150
- end
151
- end
152
-
153
- def equal(other)
154
- ::Code::Object::Boolean.new(self == other)
155
- end
156
-
157
- def strict_equal(other)
158
- ::Code::Object::Boolean.new(self === other)
159
- end
160
-
161
- def different(other)
162
- ::Code::Object::Boolean.new(self != other)
163
- end
164
-
165
- def compare(other)
166
- ::Code::Object::Integer.new(self <=> other)
167
- end
168
-
169
- def and_operator(other)
170
- truthy? ? other : self
171
- end
172
-
173
- def or_operator(other)
174
- truthy? ? self : other
175
- end
176
-
177
- def to_string
178
- ::Code::Object::String.new(to_s)
179
- end
180
-
181
- def inclusive_range(value)
182
- ::Code::Object::Range.new(self, value, exclude_end: false)
183
- end
184
-
185
- def exclusive_range(value)
186
- ::Code::Object::Range.new(self, value, exclude_end: true)
187
- end
188
-
189
- def exclamation_point
190
- if truthy?
191
- ::Code::Object::Boolean.new(false)
192
- else
193
- ::Code::Object::Boolean.new(true)
194
- end
195
- end
196
- end
197
- end