class Lab42::Curry::ArgCompiler::Positionals

Attributes

ct_pos[R]
rt_pos[R]

Public Class Methods

new() click to toggle source
# File lib/lab42/curry/arg_compiler/positionals.rb, line 68
def initialize
  @args         = {}
  @computations = {}
  @ct_pos       = 0
  @rt_pos       = 0
  @translations = {}
end

Public Instance Methods

computations() { |idx, comp| ... } click to toggle source
# File lib/lab42/curry/arg_compiler/positionals.rb, line 17
def computations
  @computations.each { |idx, comp| yield idx, comp }
end
computed(idx) click to toggle source
# File lib/lab42/curry/arg_compiler/positionals.rb, line 21
def computed idx
  @computations[idx]
end
export_args() click to toggle source
# File lib/lab42/curry/arg_compiler/positionals.rb, line 25
def export_args
  (0...(@args.keys.max&.succ||0))
    .inject [] do |result, idx|
      if @args.has_key?(idx)
        result << @args[idx]
      else
        result << RuntimeArg
      end
      result
    end
end
set_computation(comp_arg) click to toggle source
# File lib/lab42/curry/arg_compiler/positionals.rb, line 37
def set_computation comp_arg
  @args[comp_arg.position || ct_pos]         = comp_arg.class
  @computations[comp_arg.position || rt_pos] = comp_arg
end
set_runtime_arg(rt_arg) click to toggle source

An rt_arg placeholder

# File lib/lab42/curry/arg_compiler/positionals.rb, line 43
def set_runtime_arg rt_arg 
  @args[ct_pos] = rt_arg.class
  @translations[rt_arg.position || rt_pos] = ct_pos
  _update_positions
end
set_value!(value, ct_pos=nil) click to toggle source

A curried value or computation, occurs from `ct_args` or literal values in which case `ct_pos` is `nil`

# File lib/lab42/curry/arg_compiler/positionals.rb, line 50
def set_value! value, ct_pos=nil
  ct_pos ||= @ct_pos
  raise Lab42::Curry::DuplicatePositionSpecification,
    "There is already a curried value #{@args[ct_pos].inspect} at index #{ct_pos}" if _occupied?(ct_pos)
  @args[ct_pos] = value

  (@ct_pos..ct_pos.pred).each(&method(:_occupy))
  # TODO: Need to check if we have to fill the holes with RuntimeArg
  # and allow @ct_pos to point to present RuntimeArg values?

  _update_positions
end
translation(idx) click to toggle source
# File lib/lab42/curry/arg_compiler/positionals.rb, line 63
def translation idx
  @translations[idx]
end

Private Instance Methods

_occupied?(key) click to toggle source
# File lib/lab42/curry/arg_compiler/positionals.rb, line 76
def _occupied? key
  @args.has_key?(key) && @args[key] != RuntimeArg
end
_occupy(idx) click to toggle source
# File lib/lab42/curry/arg_compiler/positionals.rb, line 80
def _occupy idx
  @args[idx] = RuntimeArg unless @args.has_key?(idx)
end
_update_positions() click to toggle source
# File lib/lab42/curry/arg_compiler/positionals.rb, line 84
def _update_positions
  while @args.has_key?(@ct_pos)
    @ct_pos += 1
  end
  while @translations.has_key?(@rt_pos)
    @rt_pos += 1
  end
end