Upstream version 7.36.149.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 identity(d) {
113     return d;
114   }
115
116   function findFirstIndexInArray(ary, opt_func, opt_this) {
117     var func = opt_func || identity;
118     for (var i = 0; i < ary.length; i++) {
119       if (func.call(opt_this, ary[i], i))
120         return i;
121     }
122     return -1;
123   }
124
125   function findFirstInArray(ary, opt_func, opt_this) {
126     var i = findFirstIndexInArray(ary, opt_func, opt_func);
127     if (i === -1)
128       return undefined;
129     return ary[i];
130   }
131
132   return {
133     asArray: asArray,
134     concatenateArrays: concatenateArrays,
135     concatenateObjects: concatenateObjects,
136     compareArrays: compareArrays,
137     comparePossiblyUndefinedValues: comparePossiblyUndefinedValues,
138     dictionaryLength: dictionaryLength,
139     dictionaryKeys: dictionaryKeys,
140     dictionaryValues: dictionaryValues,
141     iterItems: iterItems,
142     iterObjectFieldsRecursively: iterObjectFieldsRecursively,
143     findFirstIndexInArray: findFirstIndexInArray,
144     findFirstInArray: findFirstInArray
145   };
146 });