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
tins-1.25.0 examples/let.rb
tdiary-5.1.1 vendor/bundle/ruby/2.7.0/gems/tins-1.24.1/examples/let.rb
tins-1.24.1 examples/let.rb
tins-1.24.0 examples/let.rb
tins-1.23.0 examples/let.rb
tdiary-5.1.0 vendor/bundle/gems/tins-1.22.2/examples/let.rb
tins-1.22.2 examples/let.rb
tins-1.22.1 examples/let.rb
tins-1.22.0 examples/let.rb
tins-1.21.1 examples/let.rb
tins-1.21.0 examples/let.rb
tins-1.20.3 examples/let.rb
tdiary-5.0.13 vendor/bundle/gems/tins-1.20.2/examples/let.rb
tdiary-5.0.12.1 vendor/bundle/gems/tins-1.20.2/examples/let.rb
tdiary-5.0.11 vendor/bundle/gems/tins-1.20.2/examples/let.rb
tdiary-5.0.11 vendor/bundle/gems/tins-1.16.3/examples/let.rb
tins-1.20.2 examples/let.rb
tins-1.20.1 examples/let.rb
tins-1.20.0 examples/let.rb
tins-1.19.0 examples/let.rb