class Erlang::ETF::Map

| 1 | 4 | N | | — | —– | —– | | 116 | Arity | Pairs |

`MAP_EXT` encodes a map. The `Arity` field is an unsigned 4 byte integer in big endian format that determines the number of key-value pairs in the map. Key and value pairs (`Ki => Vi`) are encoded in the `Pairs` section in the following order: `K1, V1, K2, V2,…, Kn, Vn`. Duplicate keys are **not allowed** within the same map.

(see [`MAP_EXT`])

[`MAP_EXT`]: erlang.org/doc/apps/erts/erl_ext_dist.html#MAP_EXT

Constants

UINT32BE

Public Class Methods

[](term, pairs = nil) click to toggle source
# File lib/erlang/etf/map.rb, line 25
def [](term, pairs = nil)
  return term if term.kind_of?(Erlang::ETF::Term)
  term = Erlang.from(term)
  return new(term, pairs)
end
erlang_load(buffer) click to toggle source
# File lib/erlang/etf/map.rb, line 31
def erlang_load(buffer)
  arity, = buffer.read(4).unpack(UINT32BE)
  pairs = Array.new(arity * 2)
  (arity * 2).times { |i| pairs[i] = Erlang::ETF.read_term(buffer) }
  map = Erlang::Map[*pairs]
  return new(map, pairs)
end
new(term, pairs = nil) click to toggle source
# File lib/erlang/etf/map.rb, line 40
def initialize(term, pairs = nil)
  raise ArgumentError, "term must be of type Map" if not Erlang.is_map(term)
  @term = term
  @pairs = pairs.freeze
end

Public Instance Methods

erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING)) click to toggle source
# File lib/erlang/etf/map.rb, line 46
def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
  buffer << MAP_EXT
  if @pairs
    arity = @pairs.length.div(2)
    buffer << [arity].pack(UINT32BE)
    (arity * 2).times { |i| Erlang::ETF.write_term(@pairs[i], buffer) }
  else
    arity = @term.size
    buffer << [arity].pack(UINT32BE)
    @term.sort.each { |key, val|
      Erlang::ETF.write_term(key, buffer)
      Erlang::ETF.write_term(val, buffer)
    }
  end
  return buffer
end
inspect() click to toggle source
Calls superclass method Erlang::ETF::Term#inspect
# File lib/erlang/etf/map.rb, line 63
def inspect
  if @pairs.nil?
    return super
  else
    return "#{self.class}[#{@term.inspect}, #{@pairs.inspect}]"
  end
end
pretty_print(pp) click to toggle source
# File lib/erlang/etf/map.rb, line 71
def pretty_print(pp)
  state = [@term]
  state.push(@pairs) if not @pairs.nil?
  return pp.group(1, "#{self.class}[", "]") do
    pp.breakable ''
    pp.seplist(state) { |obj| obj.pretty_print(pp) }
  end
end