Sha256: d8254265427667b7eaa161c399779037e31d2b900d48bf0ac22c8bb8371d13f8

Contents?: true

Size: 618 Bytes

Versions: 1

Compression:

Stored size: 618 Bytes

Contents

require_relative 'blankslate'

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 < BlankSlate
    def initialize(fns=[])
      @fns = fns
    end

    def method_missing(m, *args, &block)
      fn = -> a, x {
        if x.respond_to?(m)
          x.send(m, *a)
        else
          send(m, *a)
        end
      }.curry[args]
      ComposedFn.new(@fns + [fn])
    end

    def call(*args)
      @fns.reduce(:*).call(*args)
    end

    def to_ary
      @fns.to_ary
    end
  end
end

F = Kleisli::ComposedFn.new

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
kleisli-0.0.5 lib/kleisli/composition.rb