diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..36298d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.byebug_history diff --git a/Gemfile.lock b/Gemfile.lock index a674fa5..0091c79 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - simple_monads (0.1.3) + simple_monads (1.0.1) GEM remote: https://rubygems.org/ diff --git a/README.md b/README.md index ba70132..f49ce3b 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,15 @@ gem 'simple_monads' And then execute: -```bundle install``` +```bash +bundle install +``` Or install it yourself as: -```gem install simple_monads``` +```bash +gem install simple_monads +``` Require if necessary: @@ -44,14 +48,37 @@ end Then using this object you can check and use monads: +***Failure examples*** + ```ruby object = SomeClass.new + result = object.return_failure + result.failure? # true + +result.success? # false + result.failure # { error: 'text' } + +result.success_or(19.32) # 19.32 ``` -The successful scenario is exactly the same. +***Success examples*** + +```ruby +object = SomeClass.new + +result = object.return_success + +result.failure? # false + +result.success? # true + +result.success # 5 + +result.success_or(19.32) # 5 +``` ## Contribution diff --git a/lib/simple_monads.rb b/lib/simple_monads.rb index 04e814e..aa59b99 100644 --- a/lib/simple_monads.rb +++ b/lib/simple_monads.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true -require_relative 'simple_monads/failure_object' -require_relative 'simple_monads/success_object' +require_relative 'simple_monads/failure_result' +require_relative 'simple_monads/success_result' # Main module module SimpleMonads def Success(object = nil) # rubocop:disable Naming/MethodName - SuccessObject.new(object) + SuccessResult.new(object) end def Failure(object = nil) # rubocop:disable Naming/MethodName - FailureObject.new(object) + FailureResult.new(object) end end diff --git a/lib/simple_monads/failure_object.rb b/lib/simple_monads/base_result.rb similarity index 53% rename from lib/simple_monads/failure_object.rb rename to lib/simple_monads/base_result.rb index e64adc1..5e22de5 100644 --- a/lib/simple_monads/failure_object.rb +++ b/lib/simple_monads/base_result.rb @@ -1,25 +1,20 @@ # frozen_string_literal: true module SimpleMonads - # failure object - class FailureObject + # Base Result monads + class BaseResult attr_reader :object - alias failure object def initialize(object = nil) @object = object end - def failure? - true - end - - def success? - false + def success_or(value) + failure? ? value : success end def inspect - "Failure(#{object})" + "#{self.class.to_s[14..-7]}(#{object})" end end end diff --git a/lib/simple_monads/failure_result.rb b/lib/simple_monads/failure_result.rb new file mode 100644 index 0000000..13bdac6 --- /dev/null +++ b/lib/simple_monads/failure_result.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require_relative 'base_result' + +module SimpleMonads + # failure object + class FailureResult < BaseResult + alias failure object + + def failure? + true + end + + def success? + false + end + end +end diff --git a/lib/simple_monads/success_object.rb b/lib/simple_monads/success_result.rb similarity index 52% rename from lib/simple_monads/success_object.rb rename to lib/simple_monads/success_result.rb index 2f77eb4..d323fd1 100644 --- a/lib/simple_monads/success_object.rb +++ b/lib/simple_monads/success_result.rb @@ -1,15 +1,12 @@ # frozen_string_literal: true +require_relative 'base_result' + module SimpleMonads # success object - class SuccessObject - attr_reader :object + class SuccessResult < BaseResult alias success object - def initialize(object = nil) - @object = object - end - def failure? false end @@ -17,9 +14,5 @@ def failure? def success? true end - - def inspect - "Success(#{object})" - end end end diff --git a/lib/simple_monads/version.rb b/lib/simple_monads/version.rb index 7ff3d5b..a368220 100644 --- a/lib/simple_monads/version.rb +++ b/lib/simple_monads/version.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true module SimpleMonads - VERSION = '0.1.4' + # gem version + VERSION = '1.0.1' end diff --git a/test/lib/simple_monads/failure_result_test.rb b/test/lib/simple_monads/failure_result_test.rb new file mode 100644 index 0000000..a4db5b7 --- /dev/null +++ b/test/lib/simple_monads/failure_result_test.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require_relative '../../test_helper' + +module SimpleMonads + class FailureResultTest < Minitest::Test + def setup + @failure = FailureResult.new(2) + end + + def test_inspect + assert_equal('Failure(2)', @failure.inspect) + end + end +end diff --git a/test/lib/simple_monads/success_result_test.rb b/test/lib/simple_monads/success_result_test.rb new file mode 100644 index 0000000..5cd1e1f --- /dev/null +++ b/test/lib/simple_monads/success_result_test.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require_relative '../../test_helper' + +module SimpleMonads + class SuccessResultTest < Minitest::Test + def setup + @failure = SuccessResult.new(2) + end + + def test_inspect + assert_equal('Success(2)', @failure.inspect) + end + end +end diff --git a/test/lib/simple_monads_test.rb b/test/lib/simple_monads_test.rb index c0fd2a2..5b9535b 100644 --- a/test/lib/simple_monads_test.rb +++ b/test/lib/simple_monads_test.rb @@ -49,4 +49,12 @@ def test_empty_success assert_nil(result.success) end + + def test_success_or + result_success = @object.return_success + result_failure = @object.return_failure + + assert_equal(7, result_failure.success_or(7)) + assert_equal(5, result_success.success_or(14.54)) + end end