Module Kernel
In: lib/facets/core-uncommon/facets/kernel/demo.rb
lib/facets/core-uncommon/facets/kernel/trap_chain.rb
lib/facets/core-uncommon/facets/kernel/y.rb
lib/facets/core-uncommon/facets/kernel/memo.rb
lib/facets/core-uncommon/facets/kernel/eigenclass.rb

Methods

Y   demo   eigenclass   memo   trap_chain  

Public Instance methods

Y-combinator.

 f = Y do |n, acc, &b|
   n < 2 ? acc : b.(n-1, n * acc)
 end

 f.call(5, 1) #=> 120

NOTE: This is not (presently) a common core extension and is not loaded automatically when using require ‘facets‘.

CREDIT: Michael Fellinger

[Source]

# File lib/facets/core-uncommon/facets/kernel/y.rb, line 16
  def Y(*args, &block)
    y = lambda{|*args| block.call(*args, &y) }
  end

For debugging and showing examples. Currently this takes an argument of a string in a block…

  demo {%{ a = [1,2,3] }}
  demo {%{ a.slice(1,2) }}
  demo {%{ a.map { |x| x**3 } }}

produces …

  a = [1,2,3]             #=>  [1, 2, 3]
  a.slice(1,2)            #=>  [2, 3]
  a.map { |x| x**3 }      #=>  [1, 8, 27]

TODO: Is there a way to do this without the eval string in block? Preferably just a block and no string.

NOTE: This is not (presently) a common core extension and is not loaded automatically when using require ‘facets‘.

[Source]

# File lib/facets/core-uncommon/facets/kernel/demo.rb, line 22
  def demo(out=$stdout,&block)
    out << sprintf("%-25s#=>  %s\n", expr = block.call, eval(expr, block.binding).inspect)
  end

During this trying time when no one can get their techie catchwords to stick to the refrigerator no matter how hard they slap it with the enchanted magnetic spatula, it’s good to know that the contrived phrases really do fly, graceful and unclasped and bearing north toward chilled shrimp. I know what my Hallowe’en pumpkin is going to say.

NOTE: This is not (presently) a common core extension and is not loaded automatically when using require ‘facets‘.

CREDIT: WhyTheLuckyStiff

[Source]

# File lib/facets/core-uncommon/facets/kernel/eigenclass.rb, line 16
  def eigenclass
    (class << self; self; end)
  end

Memoize a method.

  class MemoExample
    attr_accessor :a
    def m
      memo{ @a }
    end
  end

  ex = MemoExample.new

  ex.a = 10
  ex.m  #=> 10

  ex.a = 20
  ex.m  #=> 10

NOTE: This is not (presently) a common core extension and is not loaded automatically when using require ‘facets‘.

[Source]

# File lib/facets/core-uncommon/facets/kernel/memo.rb, line 29
  def memo(*args, &block)
    if args.empty?
      args = block.binding.eval('[self, __method__]')
    end
    if $MEMO.key?(args)
      $MEMO[args]
    else
      $MEMO[args] = block.call
    end
  end

Calling Kernel#trap() by itself will replace any previously registered handler code. Kernel#trap_chain(), on the other hand, will add the block you supply to the existing "list" of registered handler blocks. Similar to the way Kernel#at_exit() works, Kernel#trap_chain() will prepend the given block to the call chain for the given signal_name. When the signal occurs, your block will be executed first and then the previously registered handler will be invoked. This can be called repeatedly to create a "chain" of handlers.

NOTE: This is not (presently) a common core extension and is not loaded automatically when using require ‘facets‘.

CREDIT: Tyler Rick

[Source]

# File lib/facets/core-uncommon/facets/kernel/trap_chain.rb, line 15
  def trap_chain(signal_name, *args, &block)
    previous_interrupt_handler = trap(signal_name, *args) {}
    trap(signal_name, *args) do
      block.call
      previous_interrupt_handler.call unless previous_interrupt_handler == "DEFAULT"
    end
  end

[Validate]