corelib/hash.rb in opal-0.4.4 vs corelib/hash.rb in opal-0.5.0
- old
+ new
@@ -6,25 +6,39 @@
if (arguments.length == 1 && arguments[0]._klass == Hash) {
return arguments[0];
}
var hash = new Hash._alloc,
- args = $slice.call(arguments),
keys = [],
assocs = {};
hash.map = assocs;
hash.keys = keys;
- for (var i = 0, length = args.length, key; i < length; i++) {
- var key = args[i], obj = args[++i];
+ if (arguments.length == 1 && arguments[0]._isArray) {
+ var args = arguments[0];
- if (assocs[key] == null) {
- keys.push(key);
+ for (var i = 0, length = args.length; i < length; i++) {
+ var key = args[i][0], obj = args[i][1];
+
+ if (assocs[key] == null) {
+ keys.push(key);
+ }
+
+ assocs[key] = obj;
}
+ }
+ else {
+ for (var i = 0, length = arguments.length, key; i < length; i++) {
+ var key = arguments[i], obj = arguments[++i];
- assocs[key] = obj;
+ if (assocs[key] == null) {
+ keys.push(key);
+ }
+
+ assocs[key] = obj;
+ }
}
return hash;
};
}
@@ -48,59 +62,59 @@
`$hash.apply(null, objs)`
end
def self.allocate
%x{
- var hash = new #{self}._alloc;
+ var hash = new self._alloc;
hash.map = {};
hash.keys = [];
return hash;
}
end
def initialize(defaults = undefined, &block)
%x{
if (defaults != null) {
if (defaults.constructor == Object) {
- var map = #{self}.map, keys = #{self}.keys;
+ var map = self.map, keys = self.keys;
for (var key in defaults) {
keys.push(key);
map[key] = defaults[key];
}
}
else {
- #{self}.none = defaults;
+ self.none = defaults;
}
}
else if (block !== nil) {
- #{self}.proc = block;
+ self.proc = block;
}
- return #{self};
+ return self;
}
end
def ==(other)
%x{
- if (#{self} === other) {
+ if (self === other) {
return true;
}
if (!other.map || !other.keys) {
return false;
}
- if (#{self}.keys.length !== other.keys.length) {
+ if (self.keys.length !== other.keys.length) {
return false;
}
- var map = #{self}.map,
+ var map = self.map,
map2 = other.map;
- for (var i = 0, length = #{self}.keys.length; i < length; i++) {
- var key = #{self}.keys[i], obj = map[key], obj2 = map2[key];
+ for (var i = 0, length = self.keys.length; i < length; i++) {
+ var key = self.keys[i], obj = map[key], obj2 = map2[key];
if (#{`obj` != `obj2`}) {
return false;
}
}
@@ -109,74 +123,77 @@
}
end
def [](key)
%x{
- var bucket = #{self}.map[key];
+ var map = self.map;
- if (bucket != null) {
- return bucket;
+ if ($hasOwn.call(map, key)) {
+ return map[key];
}
- var proc = #{@proc};
+ var proc = #@proc;
if (proc !== nil) {
return #{ `proc`.call self, key };
}
- return #{@none};
+ return #@none;
}
end
def []=(key, value)
%x{
- var map = #{self}.map;
+ var map = self.map;
if (!$hasOwn.call(map, key)) {
- #{self}.keys.push(key);
+ self.keys.push(key);
}
map[key] = value;
return value;
}
end
def assoc(object)
%x{
- var keys = #{self}.keys, key;
+ var keys = self.keys, key;
for (var i = 0, length = keys.length; i < length; i++) {
key = keys[i];
if (#{`key` == object}) {
- return [key, #{self}.map[key]];
+ return [key, self.map[key]];
}
}
return nil;
}
end
def clear
%x{
- #{self}.map = {};
- #{self}.keys = [];
- return #{self};
+ self.map = {};
+ self.keys = [];
+ return self;
}
end
def clone
%x{
- var result = $hash(),
- map = #{self}.map,
+ var result = new self._klass._alloc();
+
+ result.map = {}; result.keys = [];
+
+ var map = self.map,
map2 = result.map,
keys2 = result.keys;
- for (var i = 0, length = #{self}.keys.length; i < length; i++) {
- keys2.push(#{self}.keys[i]);
- map2[#{self}.keys[i]] = map[#{self}.keys[i]];
+ for (var i = 0, length = self.keys.length; i < length; i++) {
+ keys2.push(self.keys[i]);
+ map2[self.keys[i]] = map[self.keys[i]];
}
return result;
}
end
@@ -197,15 +214,15 @@
@proc = proc
end
def delete(key)
%x{
- var map = #{self}.map, result = map[key];
+ var map = self.map, result = map[key];
if (result != null) {
delete map[key];
- #{self}.keys.$delete(key);
+ self.keys.$delete(key);
return result;
}
return nil;
@@ -214,11 +231,11 @@
def delete_if(&block)
return enum_for :delete_if unless block
%x{
- var map = #{self}.map, keys = #{self}.keys, value;
+ var map = self.map, keys = self.keys, value;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], obj = map[key];
if ((value = block(key, obj)) === $breaker) {
@@ -232,77 +249,81 @@
length--;
i--;
}
}
- return #{self};
+ return self;
}
end
alias dup clone
def each(&block)
return enum_for :each unless block
%x{
- var map = #{self}.map, keys = #{self}.keys;
+ var map = self.map,
+ keys = self.keys;
for (var i = 0, length = keys.length; i < length; i++) {
- var key = keys[i];
+ var key = keys[i],
+ value = $opal.$yield1(block, [key, map[key]]);
- #{yield [`key`, `map[key]`]};
+ if (value === $breaker) {
+ return $breaker.$v;
+ }
}
- return #{self};
+ return self;
}
end
def each_key(&block)
return enum_for :each_key unless block
%x{
- var keys = #{self}.keys;
+ var keys = self.keys;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i];
if (block(key) === $breaker) {
return $breaker.$v;
}
}
- return #{self};
+ return self;
}
end
alias each_pair each
def each_value(&block)
return enum_for :each_value unless block
%x{
- var map = #{self}.map, keys = #{self}.keys;
+ var map = self.map, keys = self.keys;
for (var i = 0, length = keys.length; i < length; i++) {
if (block(map[keys[i]]) === $breaker) {
return $breaker.$v;
}
}
- return #{self};
+ return self;
}
end
def empty?
- `#{self}.keys.length === 0`
+ `self.keys.length === 0`
end
alias eql? ==
def fetch(key, defaults = undefined, &block)
%x{
- var value = #{self}.map[key];
+ var value = self.map[key];
if (value != null) {
return value;
}
@@ -324,11 +345,11 @@
}
end
def flatten(level=undefined)
%x{
- var map = #{self}.map, keys = #{self}.keys, result = [];
+ var map = self.map, keys = self.keys, result = [];
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], value = map[key];
result.push(key);
@@ -349,59 +370,59 @@
return result;
}
end
def has_key?(key)
- `#{self}.map[key] != null`
+ `$hasOwn.call(self.map, key)`
end
def has_value?(value)
%x{
- for (var assoc in #{self}.map) {
- if (#{`#{self}.map[assoc]` == value}) {
+ for (var assoc in self.map) {
+ if (#{`self.map[assoc]` == value}) {
return true;
}
}
return false;
}
end
def hash
- `#{self}._id`
+ `self._id`
end
alias include? has_key?
def index(object)
%x{
- var map = #{self}.map, keys = #{self}.keys;
+ var map = self.map, keys = self.keys;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i];
- if (#{object == `map[key]`}) {
+ if (#{`map[key]` == object}) {
return key;
}
}
return nil;
}
end
def indexes(*keys)
%x{
- var result = [], map = #{self}.map, val;
+ var result = [], map = self.map, val;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], val = map[key];
if (val != null) {
result.push(val);
}
else {
- result.push(#{self}.none);
+ result.push(self.none);
}
}
return result;
}
@@ -409,16 +430,16 @@
alias indices indexes
def inspect
%x{
- var inspect = [], keys = #{self}.keys, map = #{self}.map;
+ var inspect = [], keys = self.keys, map = self.map;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], val = map[key];
- if (val === #{self}) {
+ if (val === self) {
inspect.push(#{`key`.inspect} + '=>' + '{...}');
} else {
inspect.push(#{`key`.inspect} + '=>' + #{`map[key]`.inspect});
}
}
@@ -427,11 +448,11 @@
}
end
def invert
%x{
- var result = $hash(), keys = #{self}.keys, map = #{self}.map,
+ var result = $hash(), keys = self.keys, map = self.map,
keys2 = result.keys, map2 = result.map;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], obj = map[key];
@@ -445,11 +466,11 @@
def keep_if(&block)
return enum_for :keep_if unless block
%x{
- var map = #{self}.map, keys = #{self}.keys, value;
+ var map = self.map, keys = self.keys, value;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], obj = map[key];
if ((value = block(key, obj)) === $breaker) {
@@ -463,35 +484,31 @@
length--;
i--;
}
}
- return #{self};
+ return self;
}
end
alias key index
alias key? has_key?
def keys
- %x{
- return #{self}.keys.slice(0);
- }
+ `self.keys.slice(0)`
end
def length
- %x{
- return #{self}.keys.length;
- }
+ `self.keys.length`
end
alias member? has_key?
def merge(other, &block)
%x{
- var keys = #{self}.keys, map = #{self}.map,
+ var keys = self.keys, map = self.map,
result = $hash(), keys2 = result.keys, map2 = result.map;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i];
@@ -530,11 +547,11 @@
}
end
def merge!(other, &block)
%x{
- var keys = #{self}.keys, map = #{self}.map,
+ var keys = self.keys, map = self.map,
keys2 = other.keys, map2 = other.map;
if (block === nil) {
for (var i = 0, length = keys2.length; i < length; i++) {
var key = keys2[i];
@@ -558,17 +575,17 @@
map[key] = block(key, map[key], map2[key]);
}
}
}
- return #{self};
+ return self;
}
end
def rassoc(object)
%x{
- var keys = #{self}.keys, map = #{self}.map;
+ var keys = self.keys, map = self.map;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], obj = map[key];
if (#{`obj` == object}) {
@@ -582,11 +599,11 @@
def reject(&block)
return enum_for :reject unless block
%x{
- var keys = #{self}.keys, map = #{self}.map,
+ var keys = self.keys, map = self.map,
result = $hash(), map2 = result.map, keys2 = result.keys;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], obj = map[key], value;
@@ -604,27 +621,27 @@
}
end
def replace(other)
%x{
- var map = #{self}.map = {}, keys = #{self}.keys = [];
+ var map = self.map = {}, keys = self.keys = [];
for (var i = 0, length = other.keys.length; i < length; i++) {
var key = other.keys[i];
keys.push(key);
map[key] = other.map[key];
}
- return #{self};
+ return self;
}
end
def select(&block)
return enum_for :select unless block
%x{
- var keys = #{self}.keys, map = #{self}.map,
+ var keys = self.keys, map = self.map,
result = $hash(), map2 = result.map, keys2 = result.keys;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], obj = map[key], value;
@@ -644,11 +661,11 @@
def select!(&block)
return enum_for :select! unless block
%x{
- var map = #{self}.map, keys = #{self}.keys, value, result = nil;
+ var map = self.map, keys = self.keys, value, result = nil;
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i], obj = map[key];
if ((value = block(key, obj)) === $breaker) {
@@ -659,21 +676,21 @@
keys.splice(i, 1);
delete map[key];
length--;
i--;
- result = #{self}
+ result = self
}
}
return result;
}
end
def shift
%x{
- var keys = #{self}.keys, map = #{self}.map;
+ var keys = self.keys, map = self.map;
if (keys.length) {
var key = keys[0], obj = map[key];
delete map[key];
@@ -686,13 +703,15 @@
}
end
alias size length
+ alias_method :store, :[]=
+
def to_a
%x{
- var keys = #{self}.keys, map = #{self}.map, result = [];
+ var keys = self.keys, map = self.map, result = [];
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i];
result.push([key, map[key]]);
}
@@ -705,16 +724,21 @@
self
end
def to_n
%x{
- var result = {}, keys = #{self}.keys, map = #{self}.map, bucket, value;
+ var result = {},
+ keys = self.keys,
+ map = self.map,
+ bucket,
+ value;
for (var i = 0, length = keys.length; i < length; i++) {
- var key = keys[i], obj = map[key];
+ var key = keys[i],
+ obj = map[key];
- if (obj.$to_n) {
+ if (#{`obj`.respond_to? :to_n}) {
result[key] = #{`obj`.to_n};
}
else {
result[key] = obj;
}
@@ -726,29 +750,16 @@
alias to_s inspect
alias update merge!
- def value?(value)
- %x{
- var map = #{self}.map;
+ alias value? has_value?
- for (var assoc in map) {
- var v = map[assoc];
- if (#{`v` == value}) {
- return true;
- }
- }
-
- return false;
- }
- end
-
alias values_at indexes
def values
%x{
- var map = #{self}.map,
+ var map = self.map,
result = [];
for (var key in map) {
result.push(map[key]);
}