@jdeighan/coffee-utils 7.0.48 → 7.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jdeighan/coffee-utils",
3
3
  "type": "module",
4
- "version": "7.0.48",
4
+ "version": "7.0.51",
5
5
  "description": "A set of utility functions for CoffeeScript",
6
6
  "main": "coffee_utils.js",
7
7
  "exports": {
package/src/arrow.coffee CHANGED
@@ -1,5 +1,9 @@
1
1
  # arrow.coffee
2
2
 
3
+ import {undef, OL, setCharsAt} from '@jdeighan/coffee-utils'
4
+
5
+ # --- We use spaces here because Windows Terminal handles TAB chars badly
6
+
3
7
  export vbar = '│' # unicode 2502
4
8
  export hbar = '─' # unicode 2500
5
9
  export corner = '└' # unicode 2514
@@ -8,18 +12,22 @@ export space = ' '
8
12
 
9
13
  export oneIndent = vbar + space + space + space
10
14
  export arrow = corner + hbar + arrowhead + space
11
- export fourSpaces = space + space + space + space
15
+ export clearIndent = space + space + space + space
12
16
 
13
17
  # ---------------------------------------------------------------------------
14
18
 
15
19
  export getPrefix = (level, option='none') ->
16
20
 
17
- if level==0 then return ''
21
+ if level==0
22
+ if (option == 'object')
23
+ return clearIndent
24
+ else
25
+ return ''
18
26
  switch option
19
27
  when 'withArrow'
20
28
  result = oneIndent.repeat(level-1) + arrow
21
- when 'returnVal'
22
- result = oneIndent.repeat(level-1) + fourSpaces
29
+ when 'object'
30
+ result = oneIndent.repeat(level) + clearIndent
23
31
  when 'none'
24
32
  result = oneIndent.repeat(level)
25
33
  else
@@ -27,3 +35,31 @@ export getPrefix = (level, option='none') ->
27
35
  if result.length % 4 != 0
28
36
  throw new Error("getPrefix(): Bad prefix '#{result}'")
29
37
  return result
38
+
39
+ # ---------------------------------------------------------------------------
40
+
41
+ export addArrow = (prefix) ->
42
+
43
+ # console.log "in addArrow(#{OL(prefix)})"
44
+ pos = prefix.lastIndexOf(vbar)
45
+ # console.log "pos = #{pos}"
46
+ if (pos == -1)
47
+ result = prefix
48
+ else
49
+ result = setCharsAt(prefix, pos, arrow)
50
+ # console.log "result = #{OL(result)}"
51
+ return result
52
+
53
+ # ---------------------------------------------------------------------------
54
+
55
+ export removeLastVbar = (prefix) ->
56
+
57
+ # console.log "in removeLastVbar(#{OL(prefix)})"
58
+ pos = prefix.lastIndexOf(vbar)
59
+ # console.log "pos = #{pos}"
60
+ if (pos == -1)
61
+ result = prefix
62
+ else
63
+ result = setCharsAt(prefix, pos, ' ')
64
+ # console.log "result = #{OL(result)}"
65
+ return result
package/src/arrow.js CHANGED
@@ -1,5 +1,12 @@
1
1
  // Generated by CoffeeScript 2.7.0
2
- // arrow.coffee
2
+ // arrow.coffee
3
+ import {
4
+ undef,
5
+ OL,
6
+ setCharsAt
7
+ } from '@jdeighan/coffee-utils';
8
+
9
+ // --- We use spaces here because Windows Terminal handles TAB chars badly
3
10
  export var vbar = '│'; // unicode 2502
4
11
 
5
12
  export var hbar = '─'; // unicode 2500
@@ -14,20 +21,24 @@ export var oneIndent = vbar + space + space + space;
14
21
 
15
22
  export var arrow = corner + hbar + arrowhead + space;
16
23
 
17
- export var fourSpaces = space + space + space + space;
24
+ export var clearIndent = space + space + space + space;
18
25
 
19
26
  // ---------------------------------------------------------------------------
20
27
  export var getPrefix = function(level, option = 'none') {
21
28
  var result;
22
29
  if (level === 0) {
23
- return '';
30
+ if (option === 'object') {
31
+ return clearIndent;
32
+ } else {
33
+ return '';
34
+ }
24
35
  }
25
36
  switch (option) {
26
37
  case 'withArrow':
27
38
  result = oneIndent.repeat(level - 1) + arrow;
28
39
  break;
29
- case 'returnVal':
30
- result = oneIndent.repeat(level - 1) + fourSpaces;
40
+ case 'object':
41
+ result = oneIndent.repeat(level) + clearIndent;
31
42
  break;
32
43
  case 'none':
33
44
  result = oneIndent.repeat(level);
@@ -40,3 +51,33 @@ export var getPrefix = function(level, option = 'none') {
40
51
  }
41
52
  return result;
42
53
  };
54
+
55
+ // ---------------------------------------------------------------------------
56
+ export var addArrow = function(prefix) {
57
+ var pos, result;
58
+ // console.log "in addArrow(#{OL(prefix)})"
59
+ pos = prefix.lastIndexOf(vbar);
60
+ // console.log "pos = #{pos}"
61
+ if (pos === -1) {
62
+ result = prefix;
63
+ } else {
64
+ result = setCharsAt(prefix, pos, arrow);
65
+ }
66
+ // console.log "result = #{OL(result)}"
67
+ return result;
68
+ };
69
+
70
+ // ---------------------------------------------------------------------------
71
+ export var removeLastVbar = function(prefix) {
72
+ var pos, result;
73
+ // console.log "in removeLastVbar(#{OL(prefix)})"
74
+ pos = prefix.lastIndexOf(vbar);
75
+ // console.log "pos = #{pos}"
76
+ if (pos === -1) {
77
+ result = prefix;
78
+ } else {
79
+ result = setCharsAt(prefix, pos, ' ');
80
+ }
81
+ // console.log "result = #{OL(result)}"
82
+ return result;
83
+ };
@@ -1,6 +1,8 @@
1
1
  # call_stack.coffee
2
2
 
3
- import {undef, croak, assert} from '@jdeighan/coffee-utils'
3
+ import {
4
+ undef, defined, croak, assert, isBoolean, escapeStr,
5
+ } from '@jdeighan/coffee-utils'
4
6
  import {log, LOG} from '@jdeighan/coffee-utils/log'
5
7
  import {getPrefix} from '@jdeighan/coffee-utils/arrow'
6
8
 
@@ -19,7 +21,8 @@ export class CallStack
19
21
 
20
22
  constructor: () ->
21
23
 
22
- @reset()
24
+ @lStack = []
25
+ @level = 0
23
26
 
24
27
  # ........................................................................
25
28
 
@@ -27,81 +30,73 @@ export class CallStack
27
30
 
28
31
  if doDebugStack
29
32
  LOG "RESET STACK"
30
-
31
33
  @lStack = []
32
34
  @level = 0
33
35
  return
34
36
 
35
37
  # ........................................................................
36
38
 
37
- addCall: (funcName, hInfo, isLogged) ->
39
+ enter: (funcName, isLogged=false) ->
38
40
 
39
- @lStack.push({funcName, hInfo, isLogged})
41
+ if doDebugStack
42
+ LOG "[--> CALL #{funcName}]"
43
+
44
+ @lStack.push({funcName, isLogged})
40
45
  if isLogged
41
46
  @level += 1
42
47
  return
43
48
 
44
49
  # ........................................................................
50
+ # --- if stack is empty, log the error, but continue
45
51
 
46
- removeCall: (fName) ->
52
+ returnFrom: (fName) ->
47
53
 
48
- {funcName, hInfo, isLogged} = @lStack.pop()
54
+ if doDebugStack
55
+ LOG "[<-- BACK #{fName}]"
56
+
57
+ if @lStack.length == 0
58
+ LOG "ERROR: returnFrom('#{funcName}') but stack is empty"
59
+ return
60
+
61
+ {funcName, isLogged} = @lStack.pop()
49
62
  if isLogged && (@level > 0)
50
63
  @level -= 1
64
+
65
+ # --- This should do nothing
51
66
  while (funcName != fName) && (@lStack.length > 0)
52
67
  LOG "[MISSING RETURN FROM #{funcName} (return from #{fName})]"
53
- {funcName, hInfo, isLogged} = @lStack.pop()
68
+ {funcName, isLogged} = @lStack.pop()
54
69
  if isLogged && (@level > 0)
55
70
  @level -= 1
56
71
 
57
- if funcName == fName
58
- return hInfo
59
- else
72
+ if funcName != fName
60
73
  @dump()
61
74
  LOG "BAD BAD BAD BAD returnFrom('#{fName}')"
62
- return undef
75
+ return
63
76
 
64
77
  # ........................................................................
65
- # ........................................................................
66
-
67
- call: (funcName, hInfo, isLogged=undef) ->
68
78
 
69
- assert isLogged != undef, "CallStack.call(): 3 args required"
70
- mainPre = getPrefix(@level)
79
+ getLevel: () ->
71
80
 
72
- if doDebugStack
73
- prefix = ' '.repeat(@lStack.length)
74
- LOG "#{prefix}[--> CALL #{funcName}]"
75
-
76
- @addCall funcName, hInfo, isLogged
77
- auxPre = getPrefix(@level)
78
- return [mainPre, auxPre, undef]
81
+ return @level
79
82
 
80
83
  # ........................................................................
81
84
 
82
- logStr: () ->
85
+ curFunc: () ->
83
86
 
84
- pre = getPrefix(@level)
85
- return [pre, pre, undef]
87
+ if (@lStack.length == 0)
88
+ return 'main'
89
+ else
90
+ return @lStack[@lStack.length - 1].funcName
86
91
 
87
92
  # ........................................................................
88
93
 
89
- returnFrom: (funcName) ->
90
-
91
- # --- Prefixes are based on level before stack adjustment
92
- mainPre = getPrefix(@level, 'withArrow')
93
- auxPre = getPrefix(@level, 'returnVal')
94
-
95
- if @lStack.length == 0
96
- LOG "returnFrom('#{funcName}') but stack is empty"
97
- return [mainPre, auxPre, undef]
98
-
99
- hInfo = @removeCall(funcName)
100
- if doDebugStack
101
- prefix = ' '.repeat(@lStack.length)
102
- LOG "#{prefix}[<-- BACK #{funcName}]"
94
+ isActive: (fName) ->
103
95
 
104
- return [mainPre, auxPre, hInfo]
96
+ for h in @lStack
97
+ if (h.funcName == fName)
98
+ return true
99
+ return false
105
100
 
106
101
  # ........................................................................
107
102
  # ........................................................................
package/src/call_stack.js CHANGED
@@ -4,8 +4,11 @@ var doDebugStack;
4
4
 
5
5
  import {
6
6
  undef,
7
+ defined,
7
8
  croak,
8
- assert
9
+ assert,
10
+ isBoolean,
11
+ escapeStr
9
12
  } from '@jdeighan/coffee-utils';
10
13
 
11
14
  import {
@@ -27,7 +30,8 @@ export var debugStack = function(flag = true) {
27
30
  // ---------------------------------------------------------------------------
28
31
  export var CallStack = class CallStack {
29
32
  constructor() {
30
- this.reset();
33
+ this.lStack = [];
34
+ this.level = 0;
31
35
  }
32
36
 
33
37
  // ........................................................................
@@ -40,74 +44,70 @@ export var CallStack = class CallStack {
40
44
  }
41
45
 
42
46
  // ........................................................................
43
- addCall(funcName, hInfo, isLogged) {
44
- this.lStack.push({funcName, hInfo, isLogged});
47
+ enter(funcName, isLogged = false) {
48
+ if (doDebugStack) {
49
+ LOG(`[--> CALL ${funcName}]`);
50
+ }
51
+ this.lStack.push({funcName, isLogged});
45
52
  if (isLogged) {
46
53
  this.level += 1;
47
54
  }
48
55
  }
49
56
 
50
57
  // ........................................................................
51
- removeCall(fName) {
52
- var funcName, hInfo, isLogged;
53
- ({funcName, hInfo, isLogged} = this.lStack.pop());
58
+ // --- if stack is empty, log the error, but continue
59
+ returnFrom(fName) {
60
+ var funcName, isLogged;
61
+ if (doDebugStack) {
62
+ LOG(`[<-- BACK ${fName}]`);
63
+ }
64
+ if (this.lStack.length === 0) {
65
+ LOG(`ERROR: returnFrom('${funcName}') but stack is empty`);
66
+ return;
67
+ }
68
+ ({funcName, isLogged} = this.lStack.pop());
54
69
  if (isLogged && (this.level > 0)) {
55
70
  this.level -= 1;
56
71
  }
72
+ // --- This should do nothing
57
73
  while ((funcName !== fName) && (this.lStack.length > 0)) {
58
74
  LOG(`[MISSING RETURN FROM ${funcName} (return from ${fName})]`);
59
- ({funcName, hInfo, isLogged} = this.lStack.pop());
75
+ ({funcName, isLogged} = this.lStack.pop());
60
76
  if (isLogged && (this.level > 0)) {
61
77
  this.level -= 1;
62
78
  }
63
79
  }
64
- if (funcName === fName) {
65
- return hInfo;
66
- } else {
80
+ if (funcName !== fName) {
67
81
  this.dump();
68
82
  LOG(`BAD BAD BAD BAD returnFrom('${fName}')`);
69
- return undef;
70
83
  }
71
84
  }
72
85
 
73
86
  // ........................................................................
74
- // ........................................................................
75
- call(funcName, hInfo, isLogged = undef) {
76
- var auxPre, mainPre, prefix;
77
- assert(isLogged !== undef, "CallStack.call(): 3 args required");
78
- mainPre = getPrefix(this.level);
79
- if (doDebugStack) {
80
- prefix = ' '.repeat(this.lStack.length);
81
- LOG(`${prefix}[--> CALL ${funcName}]`);
82
- }
83
- this.addCall(funcName, hInfo, isLogged);
84
- auxPre = getPrefix(this.level);
85
- return [mainPre, auxPre, undef];
87
+ getLevel() {
88
+ return this.level;
86
89
  }
87
90
 
88
91
  // ........................................................................
89
- logStr() {
90
- var pre;
91
- pre = getPrefix(this.level);
92
- return [pre, pre, undef];
92
+ curFunc() {
93
+ if (this.lStack.length === 0) {
94
+ return 'main';
95
+ } else {
96
+ return this.lStack[this.lStack.length - 1].funcName;
97
+ }
93
98
  }
94
99
 
95
100
  // ........................................................................
96
- returnFrom(funcName) {
97
- var auxPre, hInfo, mainPre, prefix;
98
- // --- Prefixes are based on level before stack adjustment
99
- mainPre = getPrefix(this.level, 'withArrow');
100
- auxPre = getPrefix(this.level, 'returnVal');
101
- if (this.lStack.length === 0) {
102
- LOG(`returnFrom('${funcName}') but stack is empty`);
103
- return [mainPre, auxPre, undef];
104
- }
105
- hInfo = this.removeCall(funcName);
106
- if (doDebugStack) {
107
- prefix = ' '.repeat(this.lStack.length);
108
- LOG(`${prefix}[<-- BACK ${funcName}]`);
101
+ isActive(fName) {
102
+ var h, j, len, ref;
103
+ ref = this.lStack;
104
+ for (j = 0, len = ref.length; j < len; j++) {
105
+ h = ref[j];
106
+ if (h.funcName === fName) {
107
+ return true;
108
+ }
109
109
  }
110
- return [mainPre, auxPre, hInfo];
110
+ return false;
111
111
  }
112
112
 
113
113
  // ........................................................................
@@ -503,3 +503,15 @@ export className = (aClass) ->
503
503
  export range = (n) ->
504
504
 
505
505
  return [0..n-1]
506
+
507
+ # ---------------------------------------------------------------------------
508
+
509
+ export setCharsAt = (str, pos, str2) ->
510
+
511
+ assert (pos >= 0), "negative pos #{pos} not allowed"
512
+ assert (pos < str.length), "pos #{pos} not in #{OL(str)}"
513
+ if (pos + str2.length >= str.length)
514
+ return str.substring(0, pos) + str2
515
+ else
516
+ return str.substring(0, pos) + str2 + str.substring(pos + str2.length)
517
+
@@ -543,3 +543,14 @@ export var range = function(n) {
543
543
  return results;
544
544
  }).apply(this);
545
545
  };
546
+
547
+ // ---------------------------------------------------------------------------
548
+ export var setCharsAt = function(str, pos, str2) {
549
+ assert(pos >= 0, `negative pos ${pos} not allowed`);
550
+ assert(pos < str.length, `pos ${pos} not in ${OL(str)}`);
551
+ if (pos + str2.length >= str.length) {
552
+ return str.substring(0, pos) + str2;
553
+ } else {
554
+ return str.substring(0, pos) + str2 + str.substring(pos + str2.length);
555
+ }
556
+ };