Sha256: bf9727ba96f2ac9a1b54789366222c8242df88fc5ff677bf0481e96f7b11cb98

Contents?: true

Size: 820 Bytes

Versions: 2

Compression:

Stored size: 820 Bytes

Contents

require_relative 'blank'

class Proc
  def self.comp(f, g)
    lambda { |*args| f[g[*args]] }
  end

  def *(g)
    Proc.comp(self, g)
  end
end

module Kleisli
  class ComposedFn < Blank
    include ::Kernel

    def initialize(fns=[])
      @fns = fns
    end

    def fn(*args, &block)
      f = -> arguments, receiver {
        block.call(receiver, *arguments)
      }.curry[args]
      ComposedFn.new(@fns + [f])
    end

    def method_missing(meth, *args, &block)
      f = -> arguments, receiver {
        receiver.send(meth, *arguments, &block)
      }.curry[args]
      ComposedFn.new(@fns + [f])
    end

    def call(*args)
      if @fns.any?
        @fns.reduce(:*).call(*args)
      else
        args.first
      end
    end

    def to_ary
      @fns.to_ary
    end
  end
end

F = Kleisli::ComposedFn.new

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
kleisli-0.2.0 lib/kleisli/composition.rb
kleisli-0.1.0 lib/kleisli/composition.rb