2015-05-12 18:10:45 +02:00
|
|
|
# almost simplest hash imaginable. make good use of Lists
|
2015-03-25 16:16:20 +01:00
|
|
|
|
2015-05-11 17:55:49 +02:00
|
|
|
module Parfait
|
2015-05-12 18:10:45 +02:00
|
|
|
class Dictionary < Object
|
2015-07-21 14:40:25 +02:00
|
|
|
attribute :keys
|
2015-10-13 13:46:07 +02:00
|
|
|
attribute :values
|
2015-05-20 12:50:56 +02:00
|
|
|
# only empty initialization for now
|
|
|
|
#
|
|
|
|
# internally we store keys and values in lists, which means this does **not** scale well
|
2015-05-11 17:55:49 +02:00
|
|
|
def initialize
|
2015-05-21 20:50:17 +02:00
|
|
|
super()
|
2015-07-21 14:40:25 +02:00
|
|
|
self.keys = List.new()
|
|
|
|
self.values = List.new()
|
2015-05-11 17:55:49 +02:00
|
|
|
end
|
2015-05-20 12:50:56 +02:00
|
|
|
|
|
|
|
# are there any key/value items in the list
|
2015-05-11 17:55:49 +02:00
|
|
|
def empty?
|
2015-07-21 14:40:25 +02:00
|
|
|
self.keys.empty?
|
2015-05-11 17:55:49 +02:00
|
|
|
end
|
2014-08-28 15:20:09 +02:00
|
|
|
|
2015-05-20 12:50:56 +02:00
|
|
|
# How many key/value pairs there are
|
2015-05-11 17:55:49 +02:00
|
|
|
def length()
|
2015-07-21 14:40:25 +02:00
|
|
|
return self.keys.get_length()
|
2015-05-11 17:55:49 +02:00
|
|
|
end
|
2014-08-28 15:20:09 +02:00
|
|
|
|
2015-05-20 12:50:56 +02:00
|
|
|
# get a value fot the given key
|
2015-05-25 17:48:35 +02:00
|
|
|
# key identity is checked with == not === (ie equals not identity)
|
2015-05-20 12:50:56 +02:00
|
|
|
# return nil if no such key
|
2015-05-11 17:55:49 +02:00
|
|
|
def get(key)
|
|
|
|
index = key_index(key)
|
|
|
|
if( index )
|
2015-07-21 14:40:25 +02:00
|
|
|
self.values.get(index)
|
2015-05-11 17:55:49 +02:00
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
2015-05-20 12:50:56 +02:00
|
|
|
|
|
|
|
# same as get(key)
|
2015-05-11 17:55:49 +02:00
|
|
|
def [](key)
|
|
|
|
get(key)
|
2014-08-28 15:20:09 +02:00
|
|
|
end
|
|
|
|
|
2015-05-20 12:50:56 +02:00
|
|
|
# private method
|
2015-05-11 17:55:49 +02:00
|
|
|
def key_index(key)
|
2015-07-21 14:40:25 +02:00
|
|
|
len = self.keys.get_length()
|
2015-05-17 14:34:29 +02:00
|
|
|
index = 1
|
2015-05-11 17:55:49 +02:00
|
|
|
found = nil
|
2015-05-17 14:34:29 +02:00
|
|
|
while(index <= len)
|
2015-07-21 14:40:25 +02:00
|
|
|
if( self.keys.get(index) == key)
|
2015-05-11 17:55:49 +02:00
|
|
|
found = index
|
|
|
|
break
|
|
|
|
end
|
|
|
|
index += 1
|
2014-08-28 15:20:09 +02:00
|
|
|
end
|
2015-05-11 17:55:49 +02:00
|
|
|
found
|
2014-08-28 15:20:09 +02:00
|
|
|
end
|
|
|
|
|
2015-05-20 12:50:56 +02:00
|
|
|
# set key with value, returns value
|
2015-05-11 17:55:49 +02:00
|
|
|
def set(key , value)
|
|
|
|
index = key_index(key)
|
|
|
|
if( index )
|
2015-07-21 14:40:25 +02:00
|
|
|
self.keys.set(index , value)
|
2015-05-11 17:55:49 +02:00
|
|
|
else
|
2015-07-21 14:40:25 +02:00
|
|
|
self.keys.push(key)
|
|
|
|
self.values.push(value)
|
2015-05-11 17:55:49 +02:00
|
|
|
end
|
|
|
|
value
|
2014-08-28 15:20:09 +02:00
|
|
|
end
|
2015-05-20 12:50:56 +02:00
|
|
|
|
|
|
|
#same as set(k,v)
|
2015-05-11 17:55:49 +02:00
|
|
|
def []=(key,val)
|
|
|
|
set(key,val)
|
|
|
|
end
|
|
|
|
|
2015-05-20 12:50:56 +02:00
|
|
|
# yield to each key value pair
|
2015-05-20 09:57:20 +02:00
|
|
|
def each
|
|
|
|
index = 1
|
2015-07-21 14:40:25 +02:00
|
|
|
while index <= self.keys.get_length
|
|
|
|
key = self.keys.get(index)
|
|
|
|
value = self.values.get(index)
|
2015-05-20 09:57:20 +02:00
|
|
|
yield key , value
|
|
|
|
index = index + 1
|
|
|
|
end
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
2015-05-11 17:55:49 +02:00
|
|
|
# :rehash, :to_hash, :to_h, :to_a, :[], :fetch, :[]=, :store, :default, :default=, :default_proc, :default_proc=,
|
|
|
|
# :key, :index, :size, :length, :empty?, :each_value, :each_key, :each_pair, :each, :keys, :values,
|
|
|
|
# :values_at, :shift, :delete, :delete_if, :keep_if, :select, :select!, :reject, :reject!, :clear, :invert,
|
|
|
|
# :update, :replace, :merge!, :merge, :assoc, :rassoc, :flatten, :include?, :member?, :has_key?, :has_value?,
|
|
|
|
# :key?, :value?, :compare_by_identity, :compare_by_identity?, :entries, :sort, :sort_by, :grep, :count, :find,
|
|
|
|
# :detect, :find_index, :find_all, :collect, :map, :flat_map, :collect_concat, :inject, :reduce, :partition,
|
|
|
|
# :group_by, :first, :all?, :any?, :one?, :none?, :min, :max, :minmax, :min_by, :max_by, :minmax_by, :each_with_index,
|
|
|
|
# :reverse_each, :each_entry, :each_slice, :each_cons, :each_with_object, :zip, :take, :take_while, :drop, :drop_while,
|
|
|
|
# :cycle, :chunk, :slice_before, :lazy
|
2014-09-16 15:05:38 +02:00
|
|
|
end
|
2014-08-28 15:20:09 +02:00
|
|
|
end
|