Sha256: b9c8f21df52f6d71f5c95402ddfbb6bae96ca0566a865e0d8cc455db8db004d5

Contents?: true

Size: 1.53 KB

Versions: 3

Compression:

Stored size: 1.53 KB

Contents

# frozen_string_literal: true

module Fear
  module PartialFunction
    # Composite function produced by +PartialFunction#or_else+ method
    # @api private
    class OrElse
      include PartialFunction

      # @param f1 [Fear::PartialFunction]
      # @param f2 [Fear::PartialFunction]
      def initialize(f1, f2)
        @f1 = f1
        @f2 = f2
      end
      # @!attribute f1
      #   @return [Fear::PartialFunction]
      # @!attribute f2
      #   @return [Fear::PartialFunction]
      attr_reader :f1, :f2
      private :f1
      private :f2

      # @param arg [any]
      # @return [any]
      def call(arg)
        f1.call_or_else(arg, &f2)
      end

      alias === call
      alias [] call

      # @param other [Fear::PartialFunction]
      # @return [Fear::PartialFunction]
      def or_else(other)
        OrElse.new(f1, f2.or_else(other))
      end

      # @see Fear::PartialFunction#and_then
      def and_then(other = Utils::UNDEFINED, &block)
        Utils.with_block_or_argument("Fear::PartialFunction::OrElse#and_then", other, block) do |fun|
          OrElse.new(f1.and_then(&fun), f2.and_then(&fun))
        end
      end

      # @param arg [any]
      # @return [Boolean]
      def defined_at?(arg)
        f1.defined_at?(arg) || f2.defined_at?(arg)
      end

      # @param arg [any]
      # @param fallback [Proc]
      # @return [any]
      def call_or_else(arg, &fallback)
        f1.call_or_else(arg) do
          return f2.call_or_else(arg, &fallback)
        end
      end
    end

    private_constant :OrElse
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
fear-3.0.0 lib/fear/partial_function/or_else.rb
fear-1.2.0 lib/fear/partial_function/or_else.rb
fear-1.1.0 lib/fear/partial_function/or_else.rb