lib/spontaneous/collections/entry_set.rb in spontaneous-0.1.0.alpha1 vs lib/spontaneous/collections/entry_set.rb in spontaneous-0.2.0.alpha1
- old
+ new
@@ -1,83 +1,131 @@
# encoding: UTF-8
module Spontaneous::Collections
- class EntrySet < Array
- alias_method :array_insert, :insert
- alias_method :array_push, :push
- alias_method :array_delete, :delete
+ class EntrySet
+ include Enumerable
- attr_reader :owner
+ attr_reader :owner, :store, :length
- def initialize(owner, piece_store)
+ def initialize(owner, piece_store = [])
@owner = owner
+ @store = Hash.new { |hash, key| hash[key] = [] }
(piece_store || []).each do |data|
id = data[0]
entry = \
if data.length == 2
page = @owner._pieces.detect { |piece| piece.id == id }
- Spontaneous::PagePiece.new(@owner, page, data[1])
+ if page
+ Spontaneous::PagePiece.new(@owner, page, data[1])
+ else
+ nil
+ end
else
@owner._pieces.detect { |piece| piece.id == id }
end
# if the piece/page has been deleted or is invisible
# then we just want to silently skip it
- array_push(entry) if entry
+ if entry
+ box_id = entry.box_sid.to_s
+ @store[box_id] << entry
+ end
end
end
+ def each(&block)
+ owner.boxes.each do |box|
+ store[box.schema_id.to_s].each(&block)
+ end
+ end
+
+ def last
+ owner.boxes.last.last
+ end
+
+ def length
+ store.values.inject(0) { |sum, e| sum += e.length }
+ end
+
+ alias_method :size, :length
+
def for_box(box)
- sid = box.schema_id
- self.select { |e| e.box_sid == sid }
+ sid = box.schema_id.to_s
+ store[sid]
end
- def insert(index, piece)
- # piece.piece_store = self
- array_insert(index, piece)
- owner.entry_modified!(piece)
+ def insert(index, box, entry)
+ box_id = box.schema_id.to_s
+ store[box_id].insert(index, entry)
+ owner.entry_modified!(entry)
end
def destroy!
self.destroy
owner.entry_modified!(nil)
end
def destroy
- self.dup.each { |e| e.destroy(false) }
+ store.each do |box_id, entries|
+ entries.dup.each { |e| e.destroy(false) }
+ end
end
def remove(piece)
delete(piece)
end
- def delete(piece)
- e = array_delete(piece)
+ def delete(entry)
+ box_id = entry.box_sid.to_s
+ e = store[box_id].delete(entry)
owner.entry_modified!(nil)
end
def serialize_db
self.map { |e| e.serialize_db }
end
def set_position(content, position)
- piece = self.detect {|e| e.id == content.id }
- self.array_delete(piece)
- self.insert(position, piece)
+ entries = store[content.box_sid.to_s]
+ piece = entries.detect {|e| e.id == content.id }
+ entries.delete(piece)
+ entries.insert(position, piece)
owner.entry_modified!(piece)
end
def export
- map do | piece |
+ self.map do | piece |
piece.export
end
end
+ def freeze
+ super
+ store.values.each { |entries| entries.freeze }
+ self
+ end
+
+ # Returns a frozen version of this set containing only entries that are visible
def visible!
- self.dup.reject { |e| e.nil? or e.hidden? }.freeze
+ set = EntrySet.new(owner)
+ store.each do |box_id, entries|
+ visible = entries.reject { |e| e.nil? || e.hidden? }
+ set.concat(box_id, visible)
+ end
+ set.freeze
end
+ def ==(set)
+ super or entries == set
+ end
+
+ protected
+
+ def concat(box_id, entries)
+ store[box_id].concat(entries)
+ self
+ end
end
end