Class: GFA::RecordSet

Inherits:
Object
  • Object
show all
Defined in:
lib/gfa/record_set.rb

Defined Under Namespace

Classes: CommentSet, ContainmentSet, HeaderSet, JumpSet, LinkSet, PathSet, SegmentSet, WalkSet

Constant Summary collapse

INDEX_FIELD =
nil
TYPES =
GFA::Record.TYPES.map { |i| :"#{i}Set" }

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(gfa) ⇒ RecordSet

Returns a new instance of RecordSet.



28
29
30
31
32
# File 'lib/gfa/record_set.rb', line 28

def initialize(gfa)
  @set   = []
  @index = {}
  @gfa   = gfa
end

Instance Attribute Details

#gfaObject (readonly)

Instance-level



26
27
28
# File 'lib/gfa/record_set.rb', line 26

def gfa
  @gfa
end

#setObject (readonly)

Instance-level



26
27
28
# File 'lib/gfa/record_set.rb', line 26

def set
  @set
end

Class Method Details

.code_class(code) ⇒ Object



13
14
15
16
17
# File 'lib/gfa/record_set.rb', line 13

def self.code_class(code)
  name = GFA::Record.CODES[code.to_sym]
  raise "Unknown record type: #{code}." if name.nil?
  name_class(name)
end

.name_class(name) ⇒ Object



19
20
21
22
# File 'lib/gfa/record_set.rb', line 19

def self.name_class(name)
  name = "#{name}Set" unless name =~ /Set$/
  const_get(name)
end

Instance Method Details

#<<(v) ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/gfa/record_set.rb', line 65

def <<(v)
  v = v.split("\t") if v.is_a? String
  v = GFA::Record.code_class(code).new(*v) if v.is_a? Array
  raise "Not a GFA Record: #{v}" unless v.is_a? GFA::Record
  raise "Wrong type of record: #{v.type}" if v.type != type

  @set << v
  index(v)
end

#[](k) ⇒ Object



34
35
36
37
# File 'lib/gfa/record_set.rb', line 34

def [](k)
  return set[k] if k.is_a?(Integer)
  find_index(k)
end

#codeObject



43
44
45
# File 'lib/gfa/record_set.rb', line 43

def code
  self.class.const_get(:CODE)
end

#eql?(rec) ⇒ Boolean Also known as: ==

Returns:

  • (Boolean)


59
60
61
# File 'lib/gfa/record_set.rb', line 59

def eql?(rec)
  hash == rec.hash
end

#find_index(k) ⇒ Object



95
96
97
98
# File 'lib/gfa/record_set.rb', line 95

def find_index(k)
  k = k.value if k.is_a? GFA::Field
  @index[k]
end

#index(v) ⇒ Object



79
80
81
82
83
84
# File 'lib/gfa/record_set.rb', line 79

def index(v)
  save_index(index_id(v), v) if index_field

  # Whenever present, index also by ID
  save_index(v[:ID].value, v) if v[:ID] && v[:ID].value =~ index_id(v)
end

#index_fieldObject



47
48
49
# File 'lib/gfa/record_set.rb', line 47

def index_field
  self.class.const_get(:INDEX_FIELD)
end

#index_id(v) ⇒ Object



75
76
77
# File 'lib/gfa/record_set.rb', line 75

def index_id(v)
  v[index_field]&.value
end

#save_index(k, v) ⇒ Object



86
87
88
89
90
91
92
93
# File 'lib/gfa/record_set.rb', line 86

def save_index(k, v)
  return unless gfa.opts[:index] && k

  if @index[k]
    warn "#{type} already registered with field #{index_field}: #{k}"
  end
  @index[k] = v
end

#to_sObject



55
56
57
# File 'lib/gfa/record_set.rb', line 55

def to_s
  set.map(&:to_s).join("\n")
end

#typeObject



39
40
41
# File 'lib/gfa/record_set.rb', line 39

def type
  GFA::Record.CODES[code]
end