Sha256: 1ca49697a98618e0f845fe39ab95b7257acc166f2405c829baf1dcee022d5b5f

Contents?: true

Size: 1.84 KB

Versions: 5

Compression:

Stored size: 1.84 KB

Contents

class IndexedArray
  include Enumerable

  def initialize(parent=nil)
    @map = {}
    @store = []
    @parent = nil
  end

  def [](index)
    if String === index or Symbol === index then
      pos = @map[index]
      if pos then
        return @store[pos]
      else
        return nil
      end
    else
      return @store[index]
    end
  end

  alias slice []

  def []=(index, value)
    if String === index or Symbol === index then
      pos = @map[index]
      unless pos then
        pos = @store.size
        @map[index] = pos
      end
      return @store[pos] = value
    else
      raise XamplException.new(:non_string_or_symbol_key)
    end
  end

  def clear
    @map = {}
    @store = []
  end

  def keys
    return @map.keys
  end

  def delete(index)
    if String === index or Symbol === index then
      pos = @map.delete(index)
      if pos then
        @map.each{ | k, v| @map[k] = (v - 1) if pos < v }
        return @store.delete_at(pos)
      end
    else
      key = @map.index(index)
      pos = @map.delete(key) if key
      if pos then
        @map.each{ | k, v | @map[k] = (v - 1) if pos < v }
        return @store.delete_at(pos)
      end
    end
    return nil
  end

  alias delete_at delete

  def size
    @store.size
  end

  alias length size

  def first
    @store.first
  end

  def last
    @store.last
  end

  def each
    @store.each{ | obj | yield(obj) }
  end

  def each_index
    @store.each_index{ | i | yield(i) }
  end

  def each_key_value
    @map.each{ | k, v | yield(k, @store[v]) }
  end

  def sort
    @store.sort{ | a, b | yield(a, b) }
  end

  def sort!
    arr = []
    @map.each{ | index, pos |
      arr << [index, @store[pos]]
    }
    arr.sort!{ | a, b |
      yield(a[1], b[1])
    }
    @map = {}
    @store = []
    arr.each { | pair |
      @map[pair[0]] = @store.size
      @store << pair[1]
    }
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
hutch-xamplr-1.0.0 lib/xamplr/indexed-array.rb
hutch-xamplr-1.0.1 lib/xamplr/indexed-array.rb
hutch-xamplr-1.0.2 lib/xamplr/indexed-array.rb
hutch-xamplr-1.0.3 lib/xamplr/indexed-array.rb
hutch-xamplr-1.0.4 lib/xamplr/indexed-array.rb