Sha256: 5c460df8ae0f6754d288722c3183bc1fd5a6953c9f16e0bcf197051315e23d81

Contents?: true

Size: 1005 Bytes

Versions: 10

Compression:

Stored size: 1005 Bytes

Contents

# frozen_string_literal: true

require 'kind/basic'
require 'kind/empty'
require 'kind/presence'

module Kind
  module Try
    extend self

    def call!(object, method_name, args = Empty::ARRAY) # :nodoc
      return if KIND.nil_or_undefined?(object)

      resolve(object, method_name, args)
    end

    def call(object, *input)
      args = input.size == 1 && input[0].kind_of?(::Array) ? input[0] : input

      result = call!(object, args.shift, args)

      return result unless block_given?

      yield(result) unless KIND.nil_or_undefined?(result)
    end

    def presence(*args, &block)
      Presence.(call(*args, &block))
    end

    def self.[](*args)
      method_name = args.shift

      ->(object) { call!(object, method_name, args) }
    end

    private

      def resolve(object, method_name, args)
        return unless object.respond_to?(method_name)
        return object.public_send(method_name) if args.empty?

        object.public_send(method_name, *args)
      end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
kind-5.10.0 lib/kind/try.rb
kind-5.9.0 lib/kind/try.rb
kind-5.8.1 lib/kind/try.rb
kind-5.8.0 lib/kind/try.rb
kind-5.7.0 lib/kind/try.rb
kind-5.6.0 lib/kind/try.rb
kind-5.5.0 lib/kind/try.rb
kind-5.4.1 lib/kind/try.rb
kind-5.4.0 lib/kind/try.rb
kind-5.3.0 lib/kind/try.rb