Sha256: 3ee44b60760a03830fa9a46222af9cb38ea8094d4064ee3b4362a24ff965299a

Contents?: true

Size: 1.29 KB

Versions: 123

Compression:

Stored size: 1.29 KB

Contents

#!/usr/bin/env ruby

require 'tins'

LetScope = Tins::BlankSlate.with :instance_eval, :to_s, :inspect, :extend
class LetScope
  include Tins::MethodMissingDelegator::DelegatorModule
  include Tins::BlockSelf

  def initialize(my_self, bindings = {}, outer_scope = nil)
    super(my_self)
    @outer_scope = outer_scope
    @bindings = bindings
    extend Tins::Eigenclass
    eigenclass_eval { extend Tins::Constant }
    each_binding do |name, value|
      eigenclass_eval {  constant name, value }
    end
  end

  def each_binding(&block)
    if @outer_scope
      @outer_scope.each_binding(&block)
    end
    @bindings.each(&block)
  end

  def let(bindings = {}, &block)
    ls = LetScope.new(block_self(&block), bindings, self)
    ls.instance_eval(&block)
  end

  # Including this module into your current namespace defines the let method.
  module Include
    include Tins::BlockSelf

    def let(bindings = {}, &block)
      ls = LetScope.new(block_self(&block), bindings)
      ls.instance_eval(&block)
    end
  end
end

if $0 == __FILE__
  class Foo
    include LetScope::Include

    def twice(x)
      2 * x
    end

    def test
      let x: 1, y: twice(1) do
        let z: twice(x) do
          puts "#{x} * #{y} == #{z} # => #{x * y == twice(x)}"
        end
      end
    end
  end

  Foo.new.test
end

Version data entries

123 entries across 109 versions & 8 rubygems

Version Path
tdiary-5.1.7 vendor/bundle/ruby/2.7.0/gems/tins-1.29.1/examples/let.rb
tdiary-5.1.6 vendor/bundle/ruby/2.7.0/gems/tins-1.29.1/examples/let.rb
tdiary-5.1.6 vendor/bundle/ruby/3.0.0/gems/tins-1.29.1/examples/let.rb
tdiary-5.1.6 vendor/bundle/ruby/2.7.0/gems/tdiary-5.1.5/vendor/bundle/ruby/3.0.0/gems/tins-1.26.0/examples/let.rb
tdiary-5.1.6 vendor/bundle/ruby/2.7.0/gems/tdiary-5.1.5/vendor/bundle/ruby/3.0.0/gems/tdiary-5.1.4/vendor/bundle/ruby/2.7.0/gems/tins-1.26.0/examples/let.rb
tdiary-5.1.6 vendor/bundle/ruby/2.7.0/gems/tdiary-5.1.5/vendor/bundle/ruby/2.7.0/gems/tins-1.28.0/examples/let.rb
tdiary-5.1.6 vendor/bundle/ruby/2.7.0/gems/tins-1.28.0/examples/let.rb
tins-1.29.1 examples/let.rb
tins-1.29.0 examples/let.rb
tdiary-5.1.5 vendor/bundle/ruby/3.0.0/gems/tdiary-5.1.4/vendor/bundle/ruby/2.7.0/gems/tins-1.26.0/examples/let.rb
tdiary-5.1.5 vendor/bundle/ruby/3.0.0/gems/tins-1.26.0/examples/let.rb
tdiary-5.1.5 vendor/bundle/ruby/2.7.0/gems/tins-1.28.0/examples/let.rb
tins-1.28.0 examples/let.rb
tins-1.27.1 examples/let.rb
tins-1.27.0 examples/let.rb
tdiary-5.1.4 vendor/bundle/ruby/2.7.0/gems/tins-1.26.0/examples/let.rb
tins-1.26.0 examples/let.rb
tdiary-5.1.3 vendor/bundle/ruby/2.6.0/gems/tins-1.25.0/examples/let.rb
tdiary-5.1.3 vendor/bundle/ruby/2.7.0/gems/tins-1.25.0/examples/let.rb
tdiary-5.1.2 vendor/bundle/ruby/2.7.0/gems/tins-1.25.0/examples/let.rb