Sha256: 954367df7d7759131c6c9e14395ac326d92c77a2c2fb24fff05365ff4d57c986

Contents?: true

Size: 1.58 KB

Versions: 3

Compression:

Stored size: 1.58 KB

Contents

require 'set'

module Rupture
  module Fn
    def complement
      lambda do |*args|
        not call(*args)
      end
    end
    alias -@ complement

    def comp(fn)
      lambda do |*args|
        call(fn[*args])
      end
    end
    alias * comp

    def partial(*partials)
      lambda do |*args, &block|
        call(*(partials + args), &block)
      end
    end

    def rpartial(*partials)
      lambda do |*args, &block|
        call(*(args + partials), &block)
      end
    end

    def <<(partials)
      partial(*partials)
    end

    def >>(partials)
      rpartial(*partials)
    end

    def block(&block)
      lambda do |*args|
        call(*args, &block)
      end
    end

    # def apply(*args)
    #   last = args.pop
    #   call(*F.concat(args, last))
    # end

    def fnil(*defaults)
      lambda do |*args|
        call(*F.map(args, defaults) {|a,d| a.nil? ? d : a})
      end
    end

    def to_proc
      lambda do |key|
        call(key)
      end
    end

    def arity
      -1
    end
  end
end

class Proc
  include Rupture::Fn
end

class Method
  include Rupture::Fn
end

class Symbol
  include Rupture::Fn

  def call(object, *args, &block)
    object.method(self).call(*args, &block)
  end
  alias [] call

  def arity
    -2
  end
end

class Hash
  include Rupture::Fn
  alias call []
end

class Array
  include Rupture::Fn
  alias call []
end

class Set
  include Rupture::Fn

  def [](key)
    key if include?(key)
  end
  alias call []
end

class Module
  def [](method_name, *partials)
    lambda do |*args|
      self.send(method_name, *(partials + args))
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rupture-0.3.0 lib/rupture/fn.rb
rupture-0.2.1 lib/rupture/fn.rb
rupture-0.2.0 lib/rupture/fn.rb