diff --git a/lib/literal/array.rb b/lib/literal/array.rb index de85a23c..75b1f239 100644 --- a/lib/literal/array.rb +++ b/lib/literal/array.rb @@ -32,6 +32,19 @@ def >=(other) def inspect "Literal::Array(#{@type.inspect})" end + + def coerce(value) + case value + when self + value + when Array + Literal::Array.new(value, type: @type) + end + end + + def to_proc + method(:coerce).to_proc + end end include Enumerable diff --git a/test/array.test.rb b/test/array.test.rb index bac16396..3d266a7d 100644 --- a/test/array.test.rb +++ b/test/array.test.rb @@ -2,6 +2,35 @@ include Literal::Types +test "coerce" do + original = ["Joel", "Stephen"] + coerced = Literal::Array(String).coerce(original) + + assert_equal coerced, Literal::Array(String).new( + "Joel", "Stephen" + ) +end + +test "coerce with invalid values" do + original = ["Joel", "Stephen"] + + assert_raises(Literal::TypeError) do + Literal::Array(Integer).coerce(original) + end +end + +test "to_proc" do + mapped = [ + ["Joel", "Stephen"], + ].map(&Literal::Array(String)) + + assert_equal mapped, [ + Literal::Array(String).new( + "Joel", "Stephen" + ), + ] +end + test "===" do assert Literal::Array(_Boolean) === Literal::Array(true).new(true) assert Literal::Array(Object) === Literal::Array(Integer).new(1)