Sha256: 45aaacf7d244eb9bb5d090fe3dd5c1eda552059a21f4a08970332a1c9b69b2f4

Contents?: true

Size: 1.03 KB

Versions: 1

Compression:

Stored size: 1.03 KB

Contents

# frozen_string_literal: true

require_relative "higher_order_functions/version"
# Higher-order functions
module HigherOrderFunctions
  refine Object do
    def unfold(condition, function)
      raise ArgumentError unless block_given?

      seed = self
      array = []
      until condition[seed]
        array << function[seed]
        seed = yield(seed)
      end
      array
    end

    def sequence
      raise ArgumentError unless block_given?

      element = self
      Enumerator.new do |enumerator|
        enumerator << element
        loop { enumerator << (element = yield(element)) }
      end
    end
  end
  refine Array do
    def scan
      raise ArgumentError unless block_given?

      drop(1).inject([first]) { |result, item| result << yield(result.last, item) }
    end
  end
  refine Enumerable do
    def inject_right(init: nil, &block)
      raise ArgumentError unless block_given?

      init ? reverse_each.inject(init, &block) : reverse_each.inject(&block)
    end
    alias_method :reduce_right, :inject_right
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
higher_order_functions-0.1.0 lib/higher_order_functions.rb