From c36e3b685f20968360ba4bb29a0d238ad36042a5 Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 16:04:43 +0900 Subject: [PATCH 01/11] =?UTF-8?q?chore:=20util=20=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=83=BC=E3=83=95=E3=82=A7=E3=83=BC=E3=82=B9=E3=82=92?= =?UTF-8?q?=20buildin.rbs=20=E3=81=AB=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/builtin.rbs | 11 +++++++++++ core/enumerable.rbs | 4 ---- 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 core/builtin.rbs diff --git a/core/builtin.rbs b/core/builtin.rbs new file mode 100644 index 0000000..a1350f1 --- /dev/null +++ b/core/builtin.rbs @@ -0,0 +1,11 @@ +# rubocop:disable RBS/Lint/TopLevelInterface + +interface _ToS + def to_s: () -> String +end + +interface _Each[unchecked out T] + def each: () { (T) -> void } -> void +end + +# rubocop:enable all diff --git a/core/enumerable.rbs b/core/enumerable.rbs index 3cdf8d9..caabfaf 100644 --- a/core/enumerable.rbs +++ b/core/enumerable.rbs @@ -1,8 +1,4 @@ module Enumerable[unchecked out Elem] : _Each[Elem] - interface _Each[unchecked out T] - def each: () { (T) -> void } -> void - end - # TODO: Array # def collect: [T]() { (Elem item) -> T } -> Array[T] # From 2a040a2d584632cf9e4d6a112110b6aa8345a551 Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 16:04:58 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20`Array`=20=E3=82=92=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/array.rbs | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 core/array.rbs diff --git a/core/array.rbs b/core/array.rbs new file mode 100644 index 0000000..728343b --- /dev/null +++ b/core/array.rbs @@ -0,0 +1,82 @@ +class Array[unchecked out Elem] < Object + include Enumerable[Elem] + + def initialize: () -> void + | (Integer size, ?Elem val) -> void + + def self.[]: [T](*T item) -> Array[T] + + def +: [T](Array[T] other) -> Array[Elem | T] + + def []: %a{implicitly-returns-nil} (Integer nth) -> Elem + | (Range[Integer?] range) -> Array[Elem]? + | (Integer start, Integer length) -> Array[Elem]? + + alias at [] + + def []=: (Integer nth, Elem val) -> Elem + | (Integer start, Integer length, Elem val) -> Elem + | (Integer start, Integer length, Array[Elem] val) -> Array[Elem] + + def clear: () -> self + + def difference: (*Array[untyped] other) -> Array[Elem] + + alias - difference + + def delete_at: %a{implicitly-returns-nil} (Integer index) -> Elem + + def empty?: () -> bool + + def size: () -> Integer + + alias length size + + alias count size + + def include?: (Elem val) -> bool + + def &: (Array[untyped] other) -> Array[Elem] + + def |: [T](Array[T] other) -> Array[Elem | T] + + def first: %a{implicitly-returns-nil} () -> Elem + + def last: %a{implicitly-returns-nil} () -> Elem + + def push: (Elem val) -> self + + alias << push + + def pop: () -> Elem? + | (Integer n) -> Array[Elem] + + def shift: () -> Elem? + | (Integer n) -> Array[Elem] + + def unshift: (Elem val) -> self + + def dup: () -> Array[Elem] + + def min: %a{implicitly-returns-nil} () -> Elem + + def max: %a{implicitly-returns-nil} () -> Elem + + def minmax: () -> [Elem?, Elem?] + + def uniq: () -> Array[Elem] + + def uniq!: () -> self? + + def reverse: () -> Array[Elem] + + def reverse!: () -> self + + def inspect: () -> String + def self.inspect: () -> String + + alias to_s inspect + alias self.to_s self.inspect + + def join: (?_ToS separator) -> String +end From 22cfc7853b9f8cb10d4512f2fcc5c3332a7ced09 Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 16:05:09 +0900 Subject: [PATCH 03/11] =?UTF-8?q?chore:=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/array.rb | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 test/array.rb diff --git a/test/array.rb b/test/array.rb new file mode 100644 index 0000000..f55d246 --- /dev/null +++ b/test/array.rb @@ -0,0 +1,108 @@ +# frozen_string_literal: true + +# rubocop:disable Lint/Void +# rubocop:disable Style/EmptyLiteral +# rubocop:disable Style/RedundantArrayConstructor + +arr = [1, 2, 3] + +Array.new +Array.new 10 +Array.new 10, '' + +Array[] +Array[1, 2, 3] + +arr + [] +arr + [2] +arr + ['2'] + +arr[0] +arr[0..1] +arr[0..] +arr[...2] +arr[nil...] +arr[0, 2] + +arr.at 0 +arr.at 0..1 +arr.at 0..nil +arr.at nil...2 +arr.at nil...nil +arr.at 0, 2 + +arr[0] = 1 +arr[0, 2] = 1 +arr[0, 2] = [2, 3, 4] + +arr.clear + +arr.difference [] +arr.difference [], [1], ['a'] + +arr - [] +arr.-([], [1], ['a']) + +arr.delete_at 0 + +arr.empty? + +arr.size + +arr.length + +arr.count + +arr.include? 0 + +arr & [] +arr & [1, 2] +arr & [1, 'a', nil] + +arr | [] +arr | [4] +arr | [4, 'a', nil] + +arr.first + +arr.last + +arr.push 1 + +arr << 1 + +arr.pop +arr.pop 2 + +arr.shift +arr.shift 2 + +arr.unshift 1 + +arr.dup + +arr.min + +arr.max + +arr.minmax + +arr.uniq + +arr.uniq! + +arr.reverse + +arr.reverse! + +arr.inspect +Array.inspect + +arr.to_s +Array.to_s + +arr.join +arr.join ',' +arr.join 123 + +# rubocop:enable all From 55d7d410b7dab46bbff136d8f9c050d3c1e7265f Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 16:55:41 +0900 Subject: [PATCH 04/11] =?UTF-8?q?chore:=20=E4=B8=8D=E8=A6=81=E3=81=AA=20un?= =?UTF-8?q?checked=20=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/builtin.rbs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/builtin.rbs b/core/builtin.rbs index a1350f1..031ce3e 100644 --- a/core/builtin.rbs +++ b/core/builtin.rbs @@ -4,8 +4,10 @@ interface _ToS def to_s: () -> String end -interface _Each[unchecked out T] +interface _Each[out T] def each: () { (T) -> void } -> void end +type boolish = top + # rubocop:enable all From 19075d903e7633cb1b88b1ef233ef3d8eeb2b846 Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 16:56:09 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20mrblib=20=E3=81=8B=E3=82=89?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E3=81=95=E3=82=8C=E3=82=8B=20`Array`=20?= =?UTF-8?q?=E3=81=AE=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=82=92=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/array.rbs | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/core/array.rbs b/core/array.rbs index 728343b..7d4238b 100644 --- a/core/array.rbs +++ b/core/array.rbs @@ -1,6 +1,10 @@ class Array[unchecked out Elem] < Object include Enumerable[Elem] + interface _Pattern[T] + def ===: (T other) -> bool + end + def initialize: () -> void | (Integer size, ?Elem val) -> void @@ -79,4 +83,51 @@ class Array[unchecked out Elem] < Object alias self.to_s self.inspect def join: (?_ToS separator) -> String + + def all?: () -> bool + | (_Pattern[Elem] pattern) -> bool + | () { (Elem item) -> boolish } -> bool + + def any?: () -> bool + | (_Pattern[Elem] pattern) -> bool + | () { (Elem item) -> boolish } -> bool + + def collect!: () { (Elem item) -> Elem } -> self + + alias map! collect! + + def delete_if: () { (Elem item) -> boolish } -> self + + def each: () { (Elem item) -> void } -> self + + def each_index: () { (Integer index) -> void } -> self + + def index: (untyped val) -> Integer? + | () { (Elem item) -> boolish } -> Integer? + + alias find_index index + + def none?: () -> bool + | (_Pattern[Elem] pattern) -> bool + | () { (Elem item) -> boolish } -> bool + + def reject!: () { (Elem item) -> boolish } -> self? + + def reject: () { (Elem item) -> boolish } -> Array[Elem] + + def reverse_each: () { (Elem item) -> void } -> self + + def select: () { (Elem item) -> boolish } -> Array[Elem] + + alias filter select + + def select!: () { (Elem item) -> boolish } -> self? + + alias filter! select! + + def sort!: () -> self + | () { (Elem a, Elem b) -> Integer } -> self + + def sort: () -> Array[Elem] + | () { (Elem a, Elem b) -> Integer } -> Array[Elem] end From adc4941aeac98df696e9936a713062f69fca1f01 Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 16:56:19 +0900 Subject: [PATCH 06/11] =?UTF-8?q?chore:=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/array.rb | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/test/array.rb b/test/array.rb index f55d246..8bc6125 100644 --- a/test/array.rb +++ b/test/array.rb @@ -105,4 +105,52 @@ arr.join ',' arr.join 123 +arr.all? +arr.all? Integer +arr.all? { |item| item > 0 } + +arr.any? +arr.any? String +arr.any? { |item| item == 0 } + +arr.collect! { |item| item**2 } + +arr.map! { |item| item**2 } + +arr.delete_if { |item| item % 2 == 0 } + +arr.each { |item| item } + +arr.each_index { |index| index } + +arr.index 1 +arr.index { |item| item > 0 } + +arr.find_index 1 +arr.find_index { |item| item > 0 } + +arr.none? +arr.none? String +arr.none? { |item| item == 0 } + +arr.reject! { |item| item == 0 } + +arr.reject { |item| item == 0 } + +arr.reverse_each { |item| item } + +arr.select { |item| item % 2 == 1 } + +arr.filter { |item| item % 2 == 1 } + +arr.select! { |item| item % 2 == 1 } + +arr.filter! { |item| item % 2 == 1 } + +arr.sort! +arr.sort! { |a, b| b - a } + +arr.sort +arr.sort { |a, b| b - a } + # rubocop:enable all From 4aa610754cf9ebc9ef5d08f9ad28a666edc4306d Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 17:01:37 +0900 Subject: [PATCH 07/11] =?UTF-8?q?feat:=20`Enumerable`=20=E3=81=AE=20`TODO:?= =?UTF-8?q?=20Array`=20=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/enumerable.rbs | 7 +++---- test/enumerable.rb | 9 +++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/enumerable.rbs b/core/enumerable.rbs index caabfaf..00b85bd 100644 --- a/core/enumerable.rbs +++ b/core/enumerable.rbs @@ -1,8 +1,7 @@ module Enumerable[unchecked out Elem] : _Each[Elem] - # TODO: Array - # def collect: [T]() { (Elem item) -> T } -> Array[T] - # - # alias map collect + def collect: [T]() { (Elem item) -> T } -> Array[T] + + alias map collect def each_with_index: () { (Elem item, Integer index) -> void } -> self end diff --git a/test/enumerable.rb b/test/enumerable.rb index e1039c0..6a14d50 100644 --- a/test/enumerable.rb +++ b/test/enumerable.rb @@ -14,10 +14,11 @@ def each a = EnumerableTestClass.new a.each { |item| item } -# TODO: Array -# a.collect { |item| item } -# -# a.map { |item| item } +a.collect { |item| item } +a.collect { |item| item.size } + +a.map { |item| item } +a.map { |item| item.size } a.each_with_index do |item, index| item From 85349d78b6f9865fa69108373e689a5a31059562 Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 17:15:51 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20`Object`=20=E3=81=AE=20`TODO:=20A?= =?UTF-8?q?rray`=20=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/object.rbs | 5 ++--- test/object.rb | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/object.rbs b/core/object.rbs index 8f81b7e..6669731 100644 --- a/core/object.rbs +++ b/core/object.rbs @@ -39,9 +39,9 @@ class Object < BasicObject def nil?: () -> bool def self.nil?: () -> bool - # TODO: Array def p: () -> nil | [T](T arg0) -> T + | [T](*T args) -> Array[T] def print: (*untyped args) -> nil @@ -65,8 +65,7 @@ class Object < BasicObject alias extend include alias self.extend self.include - # TODO: Array - # def self.constants: (?bool inherit) -> Array[Symbol] + def self.constants: (?bool inherit) -> Array[Symbol] def self.public: () -> void diff --git a/test/object.rb b/test/object.rb index 0b6a68c..a996552 100644 --- a/test/object.rb +++ b/test/object.rb @@ -64,8 +64,10 @@ module TestMod end p p 1 +p 1, true, 'a' object.p object.p 1 +object.p 1, true, 'a' print print 1, true, 'a' @@ -112,6 +114,8 @@ module TestMod end Object.extend Object.extend TestMod, TestMod, TestMod +Object.constants + sprintf "%d\n", 123 printf "%d\n", 123 From 6c7c13ffda2c14865374ffd3995cb9757182dce3 Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 17:17:06 +0900 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20`Symbol`=20=E3=81=AE=20`TODO:=20A?= =?UTF-8?q?rray`=20=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/symbol.rbs | 3 +-- test/symbol.rb | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/symbol.rbs b/core/symbol.rbs index 5299ba3..b8d4fb9 100644 --- a/core/symbol.rbs +++ b/core/symbol.rbs @@ -1,6 +1,5 @@ class Symbol < Object - # TODO: Array - # def self.all_symbols: () -> Array[Symbol] + def self.all_symbols: () -> Array[Symbol] def inspect: () -> String def self.inspect: () -> String diff --git a/test/symbol.rb b/test/symbol.rb index a2b4dcf..1c68545 100644 --- a/test/symbol.rb +++ b/test/symbol.rb @@ -3,6 +3,8 @@ # rubocop:disable Lint/SymbolConversion # rubocop:disable Lint/RedundantTypeConversion +Symbol.all_symbols + :foo.inspect Symbol.inspect From 797fcacfb0e517575dcb08cce7c9134cb4b6fd06 Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 17:26:00 +0900 Subject: [PATCH 10/11] =?UTF-8?q?feat:=20`String`=20=E3=81=AE=20`TODO:=20A?= =?UTF-8?q?rray`=20=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/string.rbs | 6 ++---- test/string.rb | 7 +++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/core/string.rbs b/core/string.rbs index fe8142d..a57dcbb 100644 --- a/core/string.rbs +++ b/core/string.rbs @@ -62,8 +62,7 @@ class String < Object def slice!: (Integer nth) -> String? | (Integer nth, Integer len) -> String? - # TODO: Array - # def split: (String? sep, ?Integer limit) -> Array[String] + def split: (?String? sep, ?Integer limit) -> Array[String] def lstrip: () -> String @@ -91,8 +90,7 @@ class String < Object def include?: (String) -> bool - # TODO: Array - # def bytes: () -> Array[Integer] + def bytes: () -> Array[Integer] def upcase: () -> String diff --git a/test/string.rb b/test/string.rb index dbfc076..16d3ff5 100644 --- a/test/string.rb +++ b/test/string.rb @@ -77,6 +77,11 @@ 'abcdef'.slice! 2 'abcdef'.slice! 2, 3 +'abcdef'.split +'abcdef'.split nil +'abcdef'.split 'cd' +'abcdef'.split 'cd', 1 + ' abcdef'.lstrip ' abcdef'.lstrip! @@ -103,6 +108,8 @@ 'abcdef'.include? 'cd' +'abcdef'.bytes + 'abcdef'.upcase 'abcdef'.upcase! From 07a09d5640d68fe64fc2ad53c6bee77145c2a13f Mon Sep 17 00:00:00 2001 From: tufusa Date: Mon, 25 May 2026 17:29:23 +0900 Subject: [PATCH 11/11] =?UTF-8?q?chore:=20Rubocop=20=E3=81=AE=E3=83=AB?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=82=92=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/builtin.rbs | 1 + test/array.rb | 2 ++ test/enumerable.rb | 1 + 3 files changed, 4 insertions(+) diff --git a/core/builtin.rbs b/core/builtin.rbs index 031ce3e..3df4c94 100644 --- a/core/builtin.rbs +++ b/core/builtin.rbs @@ -1,4 +1,5 @@ # rubocop:disable RBS/Lint/TopLevelInterface +# rubocop:disable RBS/Lint/TopLevelTypeAlias interface _ToS def to_s: () -> String diff --git a/test/array.rb b/test/array.rb index 8bc6125..05347ed 100644 --- a/test/array.rb +++ b/test/array.rb @@ -3,6 +3,8 @@ # rubocop:disable Lint/Void # rubocop:disable Style/EmptyLiteral # rubocop:disable Style/RedundantArrayConstructor +# rubocop:disable Style/NumericPredicate +# rubocop:disable Style/EvenOdd arr = [1, 2, 3] diff --git a/test/enumerable.rb b/test/enumerable.rb index 6a14d50..38f7013 100644 --- a/test/enumerable.rb +++ b/test/enumerable.rb @@ -2,6 +2,7 @@ # rubocop:disable Lint/Void # rubocop:disable Style/Documentation +# rubocop:disable Style/SymbolProc class EnumerableTestClass include Enumerable