Class: DiverDown::Web::DefinitionStore

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/diver_down/web/definition_store.rb

Instance Method Summary collapse

Constructor Details

#initializeDefinitionStore

Returns a new instance of DefinitionStore.



8
9
10
11
12
13
# File 'lib/diver_down/web/definition_store.rb', line 8

def initialize
  # Hash{ Integer(unique bit flag) => DiverDown::Definition }
  @definitions = []
  @definition_group_store = Hash.new { |h, k| h[k] = [] }
  @combined_definition = nil
end

Instance Method Details

#combined_definitionDiverDown::Definition



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/diver_down/web/definition_store.rb', line 46

def combined_definition
  if @combined_definition.nil?
    @combined_definition = DiverDown::Definition.combine(
      definition_group: nil,
      title: 'All Definitions',
      definitions: @definitions
    )

    @combined_definition.freeze
  end

  @combined_definition
end

#definition_groupsArray<String, nil>

Returns:

  • (Array<String, nil>)


61
62
63
64
65
66
67
68
69
70
71
# File 'lib/diver_down/web/definition_store.rb', line 61

def definition_groups
  keys = @definition_group_store.keys

  # Sort keys with nil at the end
  with_nil = keys.include?(nil)
  keys.delete(nil) if with_nil
  keys.sort!
  keys.push(nil) if with_nil

  keys
end

#each {|DiverDown::Definition| ... } ⇒ Object



97
98
99
100
101
102
103
104
# File 'lib/diver_down/web/definition_store.rb', line 97

def each
  return enum_for(__method__) unless block_given?

  # NOTE: To allow values to be rewritten during #each, duplicate the value through #to_a.
  @definitions.each.with_index(1) do |definition, id|
    yield(id, definition)
  end
end

#empty?Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/diver_down/web/definition_store.rb', line 92

def empty?
  @definitions.empty?
end

#filter_by_definition_group(definition_group) ⇒ Array<DiverDown::Definition>

Parameters:

  • definition_group (String, nil)

Returns:



75
76
77
# File 'lib/diver_down/web/definition_store.rb', line 75

def filter_by_definition_group(definition_group)
  @definition_group_store.fetch(definition_group, [])
end

#get(id) ⇒ DiverDown::Definition

Parameters:

  • id (Integer)

Returns:

Raises:

  • (KeyError)

    if the id is not found



18
19
20
21
22
23
24
# File 'lib/diver_down/web/definition_store.rb', line 18

def get(id)
  index = id - 1

  raise(KeyError, "id not found: #{id}") if id <= 0 || @definitions.size < id

  @definitions.fetch(index)
end

#key?(id) ⇒ Boolean

Parameters:

  • id (Integer)

Returns:

  • (Boolean)


81
82
83
# File 'lib/diver_down/web/definition_store.rb', line 81

def key?(id)
  id.positive? && id <= @definitions.size
end

#lengthInteger Also known as: size

Returns:

  • (Integer)


86
87
88
# File 'lib/diver_down/web/definition_store.rb', line 86

def length
  @definitions.length
end

#set(*definitions) ⇒ Array<Integer>

Returns ids of the definitions.

Parameters:

Returns:

  • (Array<Integer>)

    ids of the definitions



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/diver_down/web/definition_store.rb', line 28

def set(*definitions)
  definitions.map do
    raise(ArgumentError, 'definition already set') if _1.store_id

    _1.store_id = @definitions.size + 1
    _1.freeze

    @definitions.push(_1)
    @definition_group_store[_1.definition_group] << _1

    # Reset combined_definition
    @combined_definition = nil

    _1.store_id
  end
end