1 |
|
2 | (function() {
|
3 | var bind, clone, curry, deepEqual, delegate, detach, extend, fromJSON, has, include, isFunction, isObject, keys, merge, negate, omit, pairs, pick, properties, property, query, ref, ref1, toJSON, values,
|
4 | slice = [].slice;
|
5 |
|
6 | ref = require("fairmont-core"), curry = ref.curry, negate = ref.negate;
|
7 |
|
8 | ref1 = require("./type"), isObject = ref1.isObject, isFunction = ref1.isFunction;
|
9 |
|
10 | deepEqual = require("./util").deepEqual;
|
11 |
|
12 | include = extend = function() {
|
13 | var i, key, len, mixin, mixins, object, value;
|
14 | object = arguments[0], mixins = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
15 | for (i = 0, len = mixins.length; i < len; i++) {
|
16 | mixin = mixins[i];
|
17 | for (key in mixin) {
|
18 | value = mixin[key];
|
19 | object[key] = value;
|
20 | }
|
21 | }
|
22 | return object;
|
23 | };
|
24 |
|
25 | merge = function() {
|
26 | var destination, i, k, len, object, objects, v;
|
27 | objects = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
28 | destination = {};
|
29 | for (i = 0, len = objects.length; i < len; i++) {
|
30 | object = objects[i];
|
31 | for (k in object) {
|
32 | v = object[k];
|
33 | destination[k] = v;
|
34 | }
|
35 | }
|
36 | return destination;
|
37 | };
|
38 |
|
39 | clone = function(object) {
|
40 | var _clone, flags, key;
|
41 | if ((object == null) || typeof object !== 'object') {
|
42 | return object;
|
43 | }
|
44 | if (object instanceof Date) {
|
45 | return new Date(object.getTime());
|
46 | }
|
47 | if (object instanceof RegExp) {
|
48 | flags = '';
|
49 | if (object.global != null) {
|
50 | flags += 'g';
|
51 | }
|
52 | if (object.ignoreCase != null) {
|
53 | flags += 'i';
|
54 | }
|
55 | if (object.multiline != null) {
|
56 | flags += 'm';
|
57 | }
|
58 | if (object.sticky != null) {
|
59 | flags += 'y';
|
60 | }
|
61 | return new RegExp(object.source, flags);
|
62 | }
|
63 | _clone = new object.constructor();
|
64 | for (key in object) {
|
65 | _clone[key] = clone(object[key]);
|
66 | }
|
67 | return _clone;
|
68 | };
|
69 |
|
70 | property = curry(function(key, object) {
|
71 | return object[key];
|
72 | });
|
73 |
|
74 | delegate = function(from, to) {
|
75 | var name, results, value;
|
76 | results = [];
|
77 | for (name in to) {
|
78 | value = to[name];
|
79 | if (isFunction(value)) {
|
80 | results.push((function(value) {
|
81 | return from[name] = function() {
|
82 | var args;
|
83 | args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
84 | return value.call.apply(value, [to].concat(slice.call(args)));
|
85 | };
|
86 | })(value));
|
87 | }
|
88 | }
|
89 | return results;
|
90 | };
|
91 |
|
92 | bind = curry(function(f, x) {
|
93 | return f.bind(x);
|
94 | });
|
95 |
|
96 | detach = function(f) {
|
97 | return curry(function() {
|
98 | var args, x;
|
99 | x = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
100 | return f.apply(x, args);
|
101 | });
|
102 | };
|
103 |
|
104 | properties = (function() {
|
105 | var defaults;
|
106 | defaults = {
|
107 | enumerable: true,
|
108 | configurable: true
|
109 | };
|
110 | return function(object, properties) {
|
111 | var key, results, value;
|
112 | results = [];
|
113 | for (key in properties) {
|
114 | value = properties[key];
|
115 | include(value, defaults);
|
116 | results.push(Object.defineProperty(object, key, value));
|
117 | }
|
118 | return results;
|
119 | };
|
120 | })();
|
121 |
|
122 | has = curry(function(p, x) {
|
123 | return x[p] != null;
|
124 | });
|
125 |
|
126 | keys = Object.keys;
|
127 |
|
128 | values = function(x) {
|
129 | var k, results, v;
|
130 | results = [];
|
131 | for (k in x) {
|
132 | v = x[k];
|
133 | results.push(v);
|
134 | }
|
135 | return results;
|
136 | };
|
137 |
|
138 | pairs = function(x) {
|
139 | var k, results, v;
|
140 | results = [];
|
141 | for (k in x) {
|
142 | v = x[k];
|
143 | results.push([k, v]);
|
144 | }
|
145 | return results;
|
146 | };
|
147 |
|
148 | pick = curry(function(f, x) {
|
149 | var k, r, v;
|
150 | r = {};
|
151 | for (k in x) {
|
152 | v = x[k];
|
153 | if (f(k, v)) {
|
154 | r[k] = v;
|
155 | }
|
156 | }
|
157 | return r;
|
158 | });
|
159 |
|
160 | omit = curry(function(f, x) {
|
161 | return pick(negate(f), x);
|
162 | });
|
163 |
|
164 | query = curry(function(example, target) {
|
165 | var k, v;
|
166 | if ((isObject(example)) && (isObject(target))) {
|
167 | for (k in example) {
|
168 | v = example[k];
|
169 | if (!query(v, target[k])) {
|
170 | return false;
|
171 | }
|
172 | }
|
173 | return true;
|
174 | } else {
|
175 | return deepEqual(example, target);
|
176 | }
|
177 | });
|
178 |
|
179 | toJSON = function(x, pretty) {
|
180 | if (pretty == null) {
|
181 | pretty = false;
|
182 | }
|
183 | if (pretty) {
|
184 | return JSON.stringify(x, null, 2);
|
185 | } else {
|
186 | return JSON.stringify(x);
|
187 | }
|
188 | };
|
189 |
|
190 | fromJSON = JSON.parse;
|
191 |
|
192 | module.exports = {
|
193 | include: include,
|
194 | extend: extend,
|
195 | merge: merge,
|
196 | clone: clone,
|
197 | properties: properties,
|
198 | property: property,
|
199 | delegate: delegate,
|
200 | bind: bind,
|
201 | detach: detach,
|
202 | has: has,
|
203 | keys: keys,
|
204 | values: values,
|
205 | pairs: pairs,
|
206 | pick: pick,
|
207 | omit: omit,
|
208 | query: query,
|
209 | toJSON: toJSON,
|
210 | fromJSON: fromJSON
|
211 | };
|
212 |
|
213 | }).call(this);
|