Sha256: 29777118d1a32c33e4d5ef9634fb0ea9d25699ed837edbb1edc4c724af9f7c77

Contents?: true

Size: 1.81 KB

Versions: 1

Compression:

Stored size: 1.81 KB

Contents

# frozen_string_literal: true

module Kind
  module Maybe
    def self.none?(value)
      value == nil || value == Undefined
    end

    def self.some?(value)
      !none?(value)
    end

    def self.new(value)
      result_type = some?(value) ? Some : None
      result_type.new(value.is_a?(Result) ? value.value : value)
    end

    def self.[](value);
      new(value)
    end

    class Result
      attr_reader :value

      def initialize(value)
        @value = value
      end

      INVALID_DEFAULT_ARG = 'the default value must be defined as an argument or block'.freeze

      def value_or(default = Undefined, &block)
        return @value if some?

        if default == Undefined && !block
          raise ArgumentError, INVALID_DEFAULT_ARG
        else
          Maybe.some?(default) ? default : block.call
        end
      end

      def none?; end

      def some?; !none?; end

      def map(&fn); end

      def try(method_name = Undefined, &block)
        fn = method_name == Undefined ? block : Kind.of.Symbol(method_name).to_proc

        if Maybe.some?(value)
          result = fn.call(value)

          return result if Maybe.some?(result)
        end
      end

      private_constant :INVALID_DEFAULT_ARG
    end

    class None < Result
      def none?; true; end

      def map(&fn)
        self
      end

      alias_method :then, :map
    end

    NONE_WITH_NIL = None.new(nil)
    NONE_WITH_UNDEFINED = None.new(Undefined)

    class Some < Result
      def none?; false; end

      def map(&fn)
        result = yield(@value)

        return NONE_WITH_NIL if result == nil
        return NONE_WITH_UNDEFINED if result == Undefined
        return Some.new(result)
      end

      alias_method :then, :map
    end

    private_constant :Result, :NONE_WITH_NIL, :NONE_WITH_UNDEFINED
  end

  Optional = Maybe
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
kind-1.4.0 lib/kind/maybe.rb