Runtime assertions for Ruby literal.fun
ruby
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

More types

+160 -24
+4
lib/literal.rb
··· 33 33 def self.Struct(&block) 34 34 Class.new(Struct, &block) 35 35 end 36 + 37 + def self.Array(type) 38 + Literal::ArrayType.new(type) 39 + end 36 40 end
+20
lib/literal/array.rb
··· 1 + # frozen_string_literal: true 2 + 3 + class Literal::Array 4 + def initialize(value, type:) 5 + @value = value 6 + @type = type 7 + end 8 + 9 + attr_accessor :value, :type 10 + 11 + def <<(item) 12 + case item 13 + when @type 14 + @value << item 15 + self 16 + else 17 + raise Literal::TypeError, "Expected #{item.inspect} to be #{@type.inspect}." 18 + end 19 + end 20 + end
+20
lib/literal/array_type.rb
··· 1 + # frozen_string_literal: true 2 + 3 + class Literal::ArrayType 4 + def initialize(type) 5 + @type = type 6 + end 7 + 8 + def ===(value) 9 + case value 10 + when Literal::Array 11 + @type == value.type 12 + else 13 + false 14 + end 15 + end 16 + 17 + def new(value) 18 + Literal::Array.new(value, type: @type) 19 + end 20 + end
+19
lib/literal/hash.rb
··· 1 + # frozen_string_literal: true 2 + 3 + class Literal::Hash 4 + def initialize(value, key_type:, value_type:) 5 + @value = value 6 + @key_type = key_type 7 + @value_type = value_type 8 + end 9 + 10 + attr_accessor :value, :key_type, :value_type 11 + 12 + def []=(key, value) 13 + if @key_type === key && @value_type === value 14 + @value[key] = value 15 + else 16 + raise Literal::TypeError 17 + end 18 + end 19 + end
+21
lib/literal/hash_type.rb
··· 1 + # frozen_string_literal: true 2 + 3 + class Literal::HashType 4 + def initialize(key_type, value_type) 5 + @key_type = key_type 6 + @value_type = value_type 7 + end 8 + 9 + def ===(value) 10 + case value 11 + when Literal::Hash 12 + @key_type == value.key_type && @value_type == value.value_type 13 + else 14 + false 15 + end 16 + end 17 + 18 + def new(value) 19 + Literal::Hash.new(value, key_type: @key_type, value_type: @value_type) 20 + end 21 + end
+3
lib/literal/monads.rb
··· 5 5 Left = Literal::Left 6 6 Right = Literal::Right 7 7 Some = Literal::Some 8 + Maybe = Literal::Maybe 9 + Either = Literal::Either 10 + Result = Literal::Result 8 11 9 12 def Maybe(type) 10 13 Literal::MaybeType.new(type)
+9 -13
lib/literal/nothing_class.rb
··· 8 8 def empty? = true 9 9 def inspect = "Nothing" 10 10 11 - def value_or(fallback) 12 - fallback 11 + def value_or 12 + yield 13 13 end 14 14 15 - def map 15 + def bind 16 16 self 17 17 end 18 18 19 - def flat_map 19 + def map 20 20 self 21 21 end 22 22 23 - def or(alternative) 24 - if alternative.nil? 25 - raise Literal::TypeError, "Alternative cannot be nil." 26 - end 23 + def maybe 24 + self 25 + end 27 26 28 - if alternative.nil? 29 - self 30 - else 31 - Literal::Some.new(alternative) 32 - end 27 + def filter 28 + self 33 29 end 34 30 end
+26 -6
lib/literal/some.rb
··· 11 11 def empty? = false 12 12 def inspect = "Some(#{@value.inspect})" 13 13 14 - def value_or(_fallback) 14 + def value_or 15 15 @value 16 16 end 17 17 18 + def bind 19 + output = yield @value 20 + 21 + case output 22 + when Literal::Maybe 23 + output 24 + else 25 + raise Literal::TypeError, 26 + "Block passed to `Literal::Maybe#bind` must return a `#{Literal::Maybe.inspect}`." 27 + end 28 + end 29 + 18 30 def map 19 - Literal::Some.new(yield @value) 31 + output = yield @value 32 + Literal::Some.new(output) 20 33 end 21 34 22 - def flat_map(&block) 23 - map(&block).value_or(Nothing) 35 + def maybe 36 + output = yield @value 37 + 38 + case output 39 + when nil 40 + Literal::Nothing 41 + else 42 + Literal::Some.new(output) 43 + end 24 44 end 25 45 26 - def or(_alternative) 27 - self 46 + def filter 47 + yield @value ? self : Literal::Nothing 28 48 end 29 49 end
+15
lib/literal/types/frozen_type.rb
··· 1 + # frozen_string_literal: true 2 + 3 + class Literal::Types::FrozenType 4 + def initialize(type) 5 + @type = type 6 + end 7 + 8 + def inspect 9 + "Frozen(#{@type.inspect})" 10 + end 11 + 12 + def ===(value) 13 + value.frozen? && @type === value 14 + end 15 + end
+13
test/literal/array.rb
··· 1 + # frozen_string_literal: true 2 + 3 + let def whatever = Literal::Array(Integer).new([1, 2, 3]) 4 + 5 + describe "#<<" do 6 + test "with valid item" do 7 + expect((whatever << 4).value) == [1, 2, 3, 4] 8 + end 9 + 10 + test "with invalid item" do 11 + expect { whatever << "1" }.to_raise Literal::TypeError 12 + end 13 + end
+8 -5
test/literal/maybe.rb
··· 2 2 3 3 extend Literal::Monads 4 4 5 - User = Struct.new(:name, :address) 6 - Address = Struct.new(:street, :city, :state, :zip) 5 + Account = Struct.new(:user) 6 + User = Struct.new(:address) 7 + Address = Struct.new(:street) 7 8 8 - user = User.new("Bob", Address.new("123 Main", "Anytown", "CA", "12345")) 9 - 10 - binding.irb 9 + account = Account.new( 10 + User.new( 11 + Address.new("123 Main") 12 + ) 13 + )
+2
test/literal/result.rb
··· 4 4 5 5 describe "Result(String)" do 6 6 let def result = Result(String) 7 + 7 8 let def success = result.new("Foo") 9 + 8 10 let def failure 9 11 result.new( 10 12 StandardError.new("Bar")