@@ -81,6 +81,12 @@ def call(**args)
81
81
when "select!"
82
82
sig ( args ) { Function }
83
83
code_select! ( code_value , **globals )
84
+ when "compact"
85
+ sig ( args ) { Function . maybe }
86
+ code_compact ( code_value , **globals )
87
+ when "compact!"
88
+ sig ( args ) { Function . maybe }
89
+ code_compact! ( code_value , **globals )
84
90
when "reject"
85
91
sig ( args ) { Function }
86
92
code_reject ( code_value , **globals )
@@ -298,6 +304,52 @@ def code_reverse
298
304
List . new ( raw . reverse )
299
305
end
300
306
307
+ def code_compact ( argument = nil , **globals )
308
+ code_argument = argument . to_code
309
+
310
+ index = 0
311
+
312
+ List . new (
313
+ raw . compact do |code_element |
314
+ if code_argument . nothing?
315
+ code_element . falsy?
316
+ else
317
+ code_argument . call (
318
+ arguments : List . new ( [ code_element , Integer . new ( index ) , self ] ) ,
319
+ **globals
320
+ ) . falsy?
321
+ end
322
+ rescue Error ::Next => e
323
+ e . code_value . falsy?
324
+ ensure
325
+ index += 1
326
+ end
327
+ )
328
+ end
329
+
330
+ def code_compact! ( argument = nil , **globals )
331
+ code_argument = argument . to_code
332
+
333
+ index = 0
334
+
335
+ raw . compact! do |code_element |
336
+ if code_argument . nothing?
337
+ code_element . falsy?
338
+ else
339
+ code_argument . call (
340
+ arguments : List . new ( [ code_element , Integer . new ( index ) , self ] ) ,
341
+ **globals
342
+ ) . falsy?
343
+ end
344
+ rescue Error ::Next => e
345
+ e . code_value . falsy?
346
+ ensure
347
+ index += 1
348
+ end
349
+
350
+ self
351
+ end
352
+
301
353
def code_select ( argument , **globals )
302
354
code_argument = argument . to_code
303
355
0 commit comments