Class: Twilic::Core::Session::ShapeTable

Inherits:
Data
  • Object
show all
Defined in:
lib/twilic/core/session.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#by_idObject (readonly)

Returns the value of attribute by_id

Returns:

  • (Object)

    the current value of by_id



73
74
75
# File 'lib/twilic/core/session.rb', line 73

def by_id
  @by_id
end

#by_keysObject (readonly)

Returns the value of attribute by_keys

Returns:

  • (Object)

    the current value of by_keys



73
74
75
# File 'lib/twilic/core/session.rb', line 73

def by_keys
  @by_keys
end

#next_idObject (readonly)

Returns the value of attribute next_id

Returns:

  • (Object)

    the current value of next_id



73
74
75
# File 'lib/twilic/core/session.rb', line 73

def next_id
  @next_id
end

#observationsObject (readonly)

Returns the value of attribute observations

Returns:

  • (Object)

    the current value of observations



73
74
75
# File 'lib/twilic/core/session.rb', line 73

def observations
  @observations
end

Class Method Details

.new_tableObject



74
75
76
# File 'lib/twilic/core/session.rb', line 74

def self.new_table
  new(by_keys: {}, by_id: {}, observations: {}, next_id: 0)
end

Instance Method Details

#clearObject



129
130
131
# File 'lib/twilic/core/session.rb', line 129

def clear
  new(by_keys: {}, by_id: {}, observations: {}, next_id: 0)
end

#get_id(keys) ⇒ Object



82
83
84
85
# File 'lib/twilic/core/session.rb', line 82

def get_id(keys)
  id = by_keys[shape_key(keys)]
  id ? [id, true] : [0, false]
end

#get_keys(id) ⇒ Object



87
88
89
90
# File 'lib/twilic/core/session.rb', line 87

def get_keys(id)
  keys = by_id[id]
  keys ? [keys, true] : [nil, false]
end

#observe(keys) ⇒ Object



122
123
124
125
126
127
# File 'lib/twilic/core/session.rb', line 122

def observe(keys)
  sk = shape_key(keys)
  count = (observations[sk] || 0) + 1
  replace(observations: observations.merge(sk => count))
  count
end

#register(keys) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/twilic/core/session.rb', line 92

def register(keys)
  sk = shape_key(keys)
  id = by_keys[sk]
  return id if id

  id = next_id
  keys_copy = keys.dup
  new(
    by_keys: by_keys.merge(sk => id),
    by_id: by_id.merge(id => keys_copy),
    observations: observations,
    next_id: id + 1
  ).then { |t| t.by_keys[sk] }
end

#register_with_id(shape_id, keys) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/twilic/core/session.rb', line 107

def register_with_id(shape_id, keys)
  sk = shape_key(keys)
  if by_id.key?(shape_id)
    return shape_key(by_id[shape_id]) == sk
  end
  return false if by_keys.key?(sk) && by_keys[sk] != shape_id

  keys_copy = keys.dup
  new_by_id = by_id.merge(shape_id => keys_copy)
  new_by_keys = by_keys.merge(sk => shape_id)
  new_next = [next_id, shape_id + 1].max
  replace(by_id: new_by_id, by_keys: new_by_keys, next_id: new_next)
  true
end

#shape_key(keys) ⇒ Object



78
79
80
# File 'lib/twilic/core/session.rb', line 78

def shape_key(keys)
  keys.join("\0")
end