class BaseConvert::Digits

Public Instance Methods

[](key) click to toggle source
Calls superclass method
# File lib/base_convert/digits.rb, line 4
def [](key)
  if self.has_key?(key)
    d = super(key)
    return d.is_a?(Symbol)? self[d]: d
  end
  case key
  when Symbol
    chars = Chars.new
    key.to_s.scan(/[+-]?[[:alnum:]]+/).each do |type|
      if self.has_key?(_=type.to_sym)
        chars.add super(_)
        next
      end
      case type
      when /^((u\h+)|(k\d+))+$/
        type.scan(/[uk]\h+/).each{|s| chars.top s.to_sym}
      when /^(([ij]\d+)|([vw]\h+))+$/
        type.scan(/[ijvw]\h+/).each{|s| chars.set s}
      when /^[a-z][a-z]+$/
        chars.add Regexp.new "[[:#{type}:]]"
      when /^[a-z]$/
        chars.add Regexp.new "\\#{type}"
      when /^[A-Z]+$/i
        type.scan(/[A-Z][a-z]*/).each{|property| chars.add(/\p{#{property}}/)}
      when /^([+-])(\w+)/
        d = self[$2.to_sym]
        case $1
        when '+'
          chars.top d
        when '-'
          chars.remove d
        end
      when /^(\p{L}+)(\d+)$/
        l,m = $1,$2.to_i-1
        n = self.keys.select{|_|_=~/^#{l}\d+$/}.map{|_|_.to_s.sub(l,'').to_i}.max
        raise "no #{l}<n> digits defined" if n.nil?
        raise "out of range of #{l}#{n}" unless m<n
        chars.add self[:"#{l}#{n}"][0..m]
      else
        raise "unrecognized digits key: #{type}"
      end
    end
    return chars.uniq.join.freeze
  when String
    digits = nil # set as a side effect...
    unless registry.detect{|_|(digits=self[_]).start_with? key}
      # ...here -------------->^^^^^
      raise 'need at least 2 digits' unless key.length > 1
      raise 'digits must not have duplicates' if key.length > key.chars.uniq.length
      return key
    end
    return digits
  when Integer
    raise 'need digits to cover base' if key > 95
    return self[:P95] # Defined in configuration.rb
  end
  raise 'digits must be String|Symbol|Integer'
end
Also aliased as: get
forget!(keys=registry) click to toggle source
# File lib/base_convert/digits.rb, line 85
def forget!(keys=registry)
  [*keys].each do |k|
    while s = get(k)
      break if s.is_a? String # links to a constructed String
      raise 'expected Symbol' unless s.is_a? Symbol
      k = s
    end
    self.delete(k) if s.is_a? String
  end
end
get(key)
Alias for: []
label(d) click to toggle source
# File lib/base_convert/digits.rb, line 70
def label(d)
  registry(d) or (d[0]+d[1]+d[-2]+d[-1]).to_sym
end
memoize!(keys=registry) click to toggle source
# File lib/base_convert/digits.rb, line 74
def memoize!(keys=registry)
  [*keys].each do |k|
    while s = get(k)
      break if s.is_a? String # links to a constructed String
      raise 'expected Symbol' unless s.is_a? Symbol
      k = s
    end
    self[k]=self[k] if s.nil? # if not memoized, memoize!
  end
end
registry(d=nil) click to toggle source
# File lib/base_convert/digits.rb, line 63
def registry(d=nil)
  # BaseConvert::Number memoizes and uses specifically :P95, :B64, and :U47;
  # giving these precedence above the rest.  Defined in configuration.rb.
  @registry ||= [:P95, :B64, :U47, :G94, :Q91, :W63]
  d ? @registry.detect{|_|self[_].start_with? d}: @registry
end