Upstream version 7.35.139.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / third_party / tvcm / src / tvcm / iteration_helpers.js
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 'use strict';
6
7 tvcm.exportTo('tvcm', function() {
8   function asArray(arrayish) {
9     var values = [];
10     for (var i = 0; i < arrayish.length; i++)
11       values.push(arrayish[i]);
12     return values;
13   }
14
15   function compareArrays(x, y, elementCmp) {
16     var minLength = Math.min(x.length, y.length);
17     for (var i = 0; i < minLength; i++) {
18       var tmp = elementCmp(x[i], y[i]);
19       if (tmp)
20         return tmp;
21     }
22     if (x.length == y.length)
23       return 0;
24
25     if (x[i] === undefined)
26       return -1;
27
28     return 1;
29   }
30
31   /**
32    * Compares two values when one or both might be undefined. Undefined
33    * values are sorted after defined.
34    */
35   function comparePossiblyUndefinedValues(x, y, cmp) {
36     if (x !== undefined && y !== undefined)
37       return cmp(x, y);
38     if (x !== undefined)
39       return -1;
40     if (y !== undefined)
41       return 1;
42     return 0;
43   }
44
45   function concatenateArrays(/*arguments*/) {
46     var values = [];
47     for (var i = 0; i < arguments.length; i++) {
48       if (!(arguments[i] instanceof Array))
49         throw new Error('Arguments ' + i + 'is not an array');
50       values.push.apply(values, arguments[i]);
51     }
52     return values;
53   }
54
55   function concatenateObjects(/*arguments*/) {
56     var result = {};
57     for (var i = 0; i < arguments.length; i++) {
58       var object = arguments[i];
59       for (var j in object) {
60         result[j] = object[j];
61       }
62     }
63     return result;
64   }
65
66   function dictionaryKeys(dict) {
67     var keys = [];
68     for (var key in dict)
69       keys.push(key);
70     return keys;
71   }
72
73   function dictionaryValues(dict) {
74     var values = [];
75     for (var key in dict)
76       values.push(dict[key]);
77     return values;
78   }
79
80   function dictionaryLength(dict) {
81     var n = 0;
82     for (var key in dict)
83       n++;
84     return n;
85   }
86
87   function iterItems(dict, fn, opt_this) {
88     opt_this = opt_this || this;
89     for (var key in dict)
90       fn.call(opt_this, key, dict[key]);
91   }
92
93   function iterObjectFieldsRecursively(object, func) {
94     if (!(object instanceof Object))
95       return;
96
97     if (object instanceof Array) {
98       for (var i = 0; i < object.length; i++) {
99         func(object, i, object[i]);
100         iterObjectFieldsRecursively(object[i], func);
101       }
102       return;
103     }
104
105     for (var key in object) {
106       var value = object[key];
107       func(object, key, value);
108       iterObjectFieldsRecursively(value, func);
109     }
110   }
111
112   function sum(func, ary, opt_this) {
113     var res = 0;
114     for (var i = 0; i < ary.length; i++)
115       res += func.call(opt_this, ary[i]);
116     return res;
117   }
118
119   return {
120     asArray: asArray,
121     concatenateArrays: concatenateArrays,
122     concatenateObjects: concatenateObjects,
123     compareArrays: compareArrays,
124     comparePossiblyUndefinedValues: comparePossiblyUndefinedValues,
125     dictionaryLength: dictionaryLength,
126     dictionaryKeys: dictionaryKeys,
127     dictionaryValues: dictionaryValues,
128     iterItems: iterItems,
129     iterObjectFieldsRecursively: iterObjectFieldsRecursively,
130     sum: sum
131   };
132 });