@jdeighan/coffee-utils 11.0.3 → 11.0.5

Sign up to get free protection for your applications and to get access to all the features.
package/src/utils.coffee CHANGED
@@ -1,15 +1,29 @@
1
1
  # utils.coffee
2
2
 
3
- import {LOG, assert, croak} from '@jdeighan/exceptions'
4
-
5
- export sep_dash = '-'.repeat(42)
6
- export sep_eq = '='.repeat(42)
7
- `export const undef = undefined`
3
+ import {assert, croak} from '@jdeighan/exceptions'
4
+ import {LOG, sep_dash, sep_eq} from '@jdeighan/exceptions/log'
5
+ import {
6
+ undef, pass, defined, notdefined,
7
+ deepCopy, escapeStr, unescapeStr, hasChar, quoted, OL,
8
+ isString, isNumber, isInteger, isHash, isArray, isBoolean,
9
+ isConstructor, isFunction, isRegExp, isObject, getClassName,
10
+ jsType,
11
+ isEmpty, nonEmpty, chomp, rtrim, setCharsAt, words,
12
+ } from '@jdeighan/exceptions/utils'
13
+
14
+ export {
15
+ undef, pass, defined, notdefined, sep_dash, sep_eq,
16
+ deepCopy, escapeStr, unescapeStr, hasChar, quoted, OL,
17
+ isString, isNumber, isInteger, isHash, isArray, isBoolean,
18
+ isConstructor, isFunction, isRegExp, isObject, getClassName,
19
+ jsType,
20
+ isEmpty, nonEmpty, chomp, rtrim, setCharsAt, words,
21
+ }
8
22
 
9
23
  # ---------------------------------------------------------------------------
10
24
  # TEMP!!!!!
11
25
 
12
- export isComment = (line) ->
26
+ export isComment = (line) =>
13
27
 
14
28
  lMatches = line.match(///^
15
29
  \s*
@@ -20,30 +34,6 @@ export isComment = (line) ->
20
34
 
21
35
  # ---------------------------------------------------------------------------
22
36
 
23
- export chomp = (str) ->
24
-
25
- len = str.length
26
- if (len == 0)
27
- return ''
28
- else if (len == 1)
29
- if (str == "\r") || (str == "\n")
30
- return ''
31
- else
32
- return str
33
- else
34
- # --- check the last 2 characters
35
- tail = str.substring(len-2)
36
- if (tail == "\r\n")
37
- return str.substring(0, len-2)
38
- else
39
- tail = str.substring(len-1)
40
- if (tail == "\n")
41
- return str.substring(0, len-1)
42
- else
43
- return str
44
-
45
- # ---------------------------------------------------------------------------
46
-
47
37
  export isSubclassOf = (subClass, superClass) ->
48
38
 
49
39
  return (subClass == superClass) \
@@ -56,11 +46,6 @@ export eval_expr = (str) ->
56
46
  str = str.replace(/\bundef\b/g, 'undefined')
57
47
  return Function('"use strict";return (' + str + ')')();
58
48
 
59
- # ---------------------------------------------------------------------------
60
- # pass - do nothing
61
-
62
- export pass = () ->
63
-
64
49
  # ---------------------------------------------------------------------------
65
50
 
66
51
  export patchStr = (bigstr, pos, str) ->
@@ -90,61 +75,6 @@ export oneof = (word, lWords...) ->
90
75
 
91
76
  # ---------------------------------------------------------------------------
92
77
 
93
- export isConstructor = (f) ->
94
-
95
- try
96
- new f()
97
- catch err
98
- if (err.message.indexOf('is not a constructor') >= 0)
99
- return false;
100
- return true;
101
-
102
- # ---------------------------------------------------------------------------
103
-
104
- export jsType = (x) ->
105
-
106
- if notdefined(x)
107
- return [undef, undef]
108
- else if isString(x)
109
- if x.match(/^\s*$/)
110
- return ['string', 'empty']
111
- else
112
- return ['string', undef]
113
- else if isNumber(x)
114
- if Number.isInteger(x)
115
- return ['number', 'integer']
116
- else
117
- return ['number', undef]
118
- else if isBoolean(x)
119
- return ['boolean', undef]
120
- else if isHash(x)
121
- lKeys = Object.keys(x);
122
- if (lKeys.length == 0)
123
- return ['hash', 'empty']
124
- else
125
- return ['hash', undef]
126
- else if isArray(x)
127
- if (x.length == 0)
128
- return ['array', 'empty']
129
- else
130
- return ['array', undef]
131
- else if isConstructor(x)
132
- return ['function', 'constructor']
133
- else if isFunction(x)
134
- return ['function', undef]
135
- else if isObject(x)
136
- return ['object', undef]
137
- else
138
- croak "Unknown type: #{OL(x)}"
139
-
140
- # ---------------------------------------------------------------------------
141
-
142
- export isString = (x) ->
143
-
144
- return (typeof x == 'string') || (x instanceof String)
145
-
146
- # ---------------------------------------------------------------------------
147
-
148
78
  export isNonEmptyString = (x) ->
149
79
 
150
80
  if typeof x != 'string' && x ! instanceof String
@@ -155,64 +85,12 @@ export isNonEmptyString = (x) ->
155
85
 
156
86
  # ---------------------------------------------------------------------------
157
87
 
158
- export isBoolean = (x) ->
159
-
160
- return typeof x == 'boolean'
161
-
162
- # ---------------------------------------------------------------------------
163
-
164
- export isObject = (x, lReqKeys=undef) ->
165
-
166
- result = (typeof x == 'object') \
167
- && ! isString(x) \
168
- && ! isArray(x) \
169
- && ! isHash(x) \
170
- && ! isNumber(x)
171
- if result
172
- if defined(lReqKeys)
173
- assert isArray(lReqKeys), "lReqKeys is not an array"
174
- for key in lReqKeys
175
- if ! x.hasOwnProperty(key)
176
- return false
177
- return true
178
- else
179
- return false
180
-
181
- # ---------------------------------------------------------------------------
182
-
183
- export getClassName = (obj) ->
184
-
185
- if (typeof obj != 'object')
186
- return undef
187
- return obj.constructor.name
188
-
189
- # ---------------------------------------------------------------------------
190
-
191
- export isArray = (x) ->
192
-
193
- return Array.isArray(x)
194
-
195
- # ---------------------------------------------------------------------------
196
-
197
88
  export isNonEmptyArray = (x) ->
198
89
 
199
90
  return isArray(x) && (x.length > 0)
200
91
 
201
92
  # ---------------------------------------------------------------------------
202
93
 
203
- export isHash = (x, lKeys) ->
204
-
205
- if ! x || (getClassName(x) != 'Object')
206
- return false
207
- if defined(lKeys)
208
- assert isArray(lKeys), "isHash(): lKeys not an array"
209
- for key in lKeys
210
- if ! x.hasOwnProperty(key)
211
- return false
212
- return true
213
-
214
- # ---------------------------------------------------------------------------
215
-
216
94
  export isNonEmptyHash = (x) ->
217
95
 
218
96
  return isHash(x) && (Object.keys(x).length > 0)
@@ -225,40 +103,6 @@ export hashHasKey = (x, key) ->
225
103
  assert isString(key), "hashHasKey(): key not a string"
226
104
  return x.hasOwnProperty(key)
227
105
 
228
- # ---------------------------------------------------------------------------
229
- # isEmpty
230
- # - string is whitespace, array has no elements, hash has no keys
231
-
232
- export isEmpty = (x) ->
233
-
234
- if (x == undef) || (x == null)
235
- return true
236
- if isString(x)
237
- return x.match(/^\s*$/)
238
- if isArray(x)
239
- return x.length == 0
240
- if isHash(x)
241
- return Object.keys(x).length == 0
242
- else
243
- return false
244
-
245
- # ---------------------------------------------------------------------------
246
- # nonEmpty
247
- # - string has non-whitespace, array has elements, hash has keys
248
-
249
- export nonEmpty = (x) ->
250
-
251
- if ! x?
252
- return false
253
- if isString(x)
254
- return ! x.match(/^\s*$/)
255
- if isArray(x)
256
- return x.length > 0
257
- if isHash(x)
258
- return Object.keys(x).length > 0
259
- else
260
- croak "isEmpty(): Invalid parameter"
261
-
262
106
  # ---------------------------------------------------------------------------
263
107
 
264
108
  export notInArray = (lItems, item) ->
@@ -277,15 +121,6 @@ export pushCond = (lItems, item, doPush=notInArray) ->
277
121
 
278
122
  # ---------------------------------------------------------------------------
279
123
 
280
- export words = (str) ->
281
-
282
- str = str.trim()
283
- if (str == '')
284
- return []
285
- return str.split(/\s+/)
286
-
287
- # ---------------------------------------------------------------------------
288
-
289
124
  export isArrayOfHashes = (lItems) ->
290
125
 
291
126
  if ! isArray(lItems)
@@ -308,50 +143,6 @@ export isArrayOfStrings = (lItems) ->
308
143
 
309
144
  # ---------------------------------------------------------------------------
310
145
 
311
- export isFunction = (x) ->
312
-
313
- return typeof x == 'function'
314
-
315
- # ---------------------------------------------------------------------------
316
-
317
- export isRegExp = (x) ->
318
-
319
- return x instanceof RegExp
320
-
321
- # ---------------------------------------------------------------------------
322
-
323
- export isNumber = (x, hOptions=undef) ->
324
-
325
- result = (typeof x == 'number') || (x instanceof Number)
326
- if result && defined(hOptions)
327
- assert isHash(hOptions), "2nd arg not a hash: #{OL(hOptions)}"
328
- {min, max} = hOptions
329
- if defined(min) && (x < min)
330
- result = false
331
- if defined(max) && (x > max)
332
- result = false
333
- return result
334
-
335
- # ---------------------------------------------------------------------------
336
-
337
- export isInteger = (x, hOptions={}) ->
338
-
339
- if (typeof x == 'number')
340
- result = Number.isInteger(x)
341
- else if (x instanceof Number)
342
- result = Number.isInteger(x.valueOf())
343
- else
344
- result = false
345
-
346
- if result
347
- if defined(hOptions.min) && (x < hOptions.min)
348
- result = false
349
- if defined(hOptions.max) && (x > hOptions.max)
350
- result = false
351
- return result
352
-
353
- # ---------------------------------------------------------------------------
354
-
355
146
  export isUniqueList = (lItems, func=undef) ->
356
147
 
357
148
  if ! lItems?
@@ -435,19 +226,6 @@ export titleLine = (title, char='=', padding=2, linelen=42) ->
435
226
  strRight = char.repeat(nRight)
436
227
  return strLeft + strMiddle + strRight
437
228
 
438
- # ---------------------------------------------------------------------------
439
- # rtrim - strip trailing whitespace
440
-
441
- export rtrim = (line) ->
442
-
443
- assert isString(line), "rtrim(): line is not a string"
444
- lMatches = line.match(/\s+$/)
445
- if lMatches?
446
- n = lMatches[0].length # num chars to remove
447
- return line.substring(0, line.length - n)
448
- else
449
- return line
450
-
451
229
  # ---------------------------------------------------------------------------
452
230
  # rtrunc - strip nChars chars from right of a string
453
231
 
@@ -462,51 +240,6 @@ export ltrunc = (str, nChars) ->
462
240
 
463
241
  return str.substring(nChars)
464
242
 
465
- # ---------------------------------------------------------------------------
466
- # deepCopy - deep copy an array or object
467
-
468
- export deepCopy = (obj) ->
469
-
470
- if (obj == undef)
471
- return undef
472
- objStr = JSON.stringify(obj)
473
- try
474
- newObj = JSON.parse(objStr)
475
- catch err
476
- croak "ERROR: err.message", objStr
477
-
478
- return newObj
479
-
480
- # ---------------------------------------------------------------------------
481
- # escapeStr - escape newlines, TAB chars, etc.
482
-
483
- export hDefEsc = {
484
- "\n": '®'
485
- "\t": '→'
486
- " ": '˳'
487
- }
488
-
489
- export escapeStr = (str, hEscape=hDefEsc) ->
490
-
491
- assert isString(str), "escapeStr(): not a string"
492
- lParts = for ch in str.split('')
493
- if hEscape[ch]? then hEscape[ch] else ch
494
- return lParts.join('')
495
-
496
- # ---------------------------------------------------------------------------
497
-
498
- export oneline = (obj) ->
499
-
500
- if obj?
501
- if isString(obj)
502
- return "'#{escapeStr(obj)}'"
503
- else
504
- return JSON.stringify(obj)
505
- else
506
- return 'undef'
507
-
508
- export OL = oneline
509
-
510
243
  # ---------------------------------------------------------------------------
511
244
 
512
245
  export removeCR = (str) ->
@@ -597,18 +330,6 @@ export replaceVars = (line, hVars={}, rx=/__(env\.)?([A-Za-z_]\w*)__/g) ->
597
330
 
598
331
  # ---------------------------------------------------------------------------
599
332
 
600
- export defined = (obj) ->
601
-
602
- return (obj != undef) && (obj != null)
603
-
604
- # ---------------------------------------------------------------------------
605
-
606
- export notdefined = (obj) ->
607
-
608
- return (obj == undef) || (obj == null)
609
-
610
- # ---------------------------------------------------------------------------
611
-
612
333
  export isIterable = (obj) ->
613
334
 
614
335
  if (obj == undef) || (obj == null)
@@ -632,17 +353,6 @@ export range = (n) ->
632
353
 
633
354
  # ---------------------------------------------------------------------------
634
355
 
635
- export setCharsAt = (str, pos, str2) ->
636
-
637
- assert (pos >= 0), "negative pos #{pos} not allowed"
638
- assert (pos < str.length), "pos #{pos} not in #{OL(str)}"
639
- if (pos + str2.length >= str.length)
640
- return str.substring(0, pos) + str2
641
- else
642
- return str.substring(0, pos) + str2 + str.substring(pos + str2.length)
643
-
644
- # ---------------------------------------------------------------------------
645
-
646
356
  export getOptions = (hOptions, hDefault={}) ->
647
357
  # --- If hOptions is a string, break into words and set each to true
648
358