@jdeighan/coffee-utils 7.0.50 → 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.50",
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,7 +1,7 @@
1
1
  # call_stack.coffee
2
2
 
3
3
  import {
4
- undef, defined, croak, assert, isBoolean,
4
+ undef, defined, croak, assert, isBoolean, escapeStr,
5
5
  } from '@jdeighan/coffee-utils'
6
6
  import {log, LOG} from '@jdeighan/coffee-utils/log'
7
7
  import {getPrefix} from '@jdeighan/coffee-utils/arrow'
@@ -21,7 +21,8 @@ export class CallStack
21
21
 
22
22
  constructor: () ->
23
23
 
24
- @reset()
24
+ @lStack = []
25
+ @level = 0
25
26
 
26
27
  # ........................................................................
27
28
 
@@ -29,81 +30,73 @@ export class CallStack
29
30
 
30
31
  if doDebugStack
31
32
  LOG "RESET STACK"
32
-
33
33
  @lStack = []
34
34
  @level = 0
35
35
  return
36
36
 
37
37
  # ........................................................................
38
38
 
39
- addCall: (funcName, hInfo, isLogged) ->
39
+ enter: (funcName, isLogged=false) ->
40
40
 
41
- @lStack.push({funcName, hInfo, isLogged})
41
+ if doDebugStack
42
+ LOG "[--> CALL #{funcName}]"
43
+
44
+ @lStack.push({funcName, isLogged})
42
45
  if isLogged
43
46
  @level += 1
44
47
  return
45
48
 
46
49
  # ........................................................................
50
+ # --- if stack is empty, log the error, but continue
47
51
 
48
- removeCall: (fName) ->
52
+ returnFrom: (fName) ->
49
53
 
50
- {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()
51
62
  if isLogged && (@level > 0)
52
63
  @level -= 1
64
+
65
+ # --- This should do nothing
53
66
  while (funcName != fName) && (@lStack.length > 0)
54
67
  LOG "[MISSING RETURN FROM #{funcName} (return from #{fName})]"
55
- {funcName, hInfo, isLogged} = @lStack.pop()
68
+ {funcName, isLogged} = @lStack.pop()
56
69
  if isLogged && (@level > 0)
57
70
  @level -= 1
58
71
 
59
- if funcName == fName
60
- return hInfo
61
- else
72
+ if funcName != fName
62
73
  @dump()
63
74
  LOG "BAD BAD BAD BAD returnFrom('#{fName}')"
64
- return undef
75
+ return
65
76
 
66
77
  # ........................................................................
67
- # ........................................................................
68
-
69
- doCall: (funcName, hInfo, isLogged) ->
70
78
 
71
- assert isBoolean(isLogged), "CallStack.call(): 3 args required"
72
- mainPre = getPrefix(@level)
79
+ getLevel: () ->
73
80
 
74
- if doDebugStack
75
- prefix = ' '.repeat(@lStack.length)
76
- LOG "#{prefix}[--> CALL #{funcName}]"
77
-
78
- @addCall funcName, hInfo, isLogged
79
- auxPre = getPrefix(@level)
80
- return [mainPre, auxPre]
81
+ return @level
81
82
 
82
83
  # ........................................................................
83
84
 
84
- logStr: () ->
85
+ curFunc: () ->
85
86
 
86
- pre = getPrefix(@level)
87
- return [pre, pre, undef]
87
+ if (@lStack.length == 0)
88
+ return 'main'
89
+ else
90
+ return @lStack[@lStack.length - 1].funcName
88
91
 
89
92
  # ........................................................................
90
93
 
91
- returnFrom: (funcName) ->
92
-
93
- # --- Prefixes are based on level before stack adjustment
94
- mainPre = getPrefix(@level, 'withArrow')
95
- auxPre = getPrefix(@level, 'returnVal')
96
-
97
- if @lStack.length == 0
98
- LOG "returnFrom('#{funcName}') but stack is empty"
99
- return [mainPre, auxPre, undef]
100
-
101
- hInfo = @removeCall(funcName)
102
- if doDebugStack
103
- prefix = ' '.repeat(@lStack.length)
104
- LOG "#{prefix}[<-- BACK #{funcName}]"
94
+ isActive: (fName) ->
105
95
 
106
- return [mainPre, auxPre, hInfo]
96
+ for h in @lStack
97
+ if (h.funcName == fName)
98
+ return true
99
+ return false
107
100
 
108
101
  # ........................................................................
109
102
  # ........................................................................
package/src/call_stack.js CHANGED
@@ -7,7 +7,8 @@ import {
7
7
  defined,
8
8
  croak,
9
9
  assert,
10
- isBoolean
10
+ isBoolean,
11
+ escapeStr
11
12
  } from '@jdeighan/coffee-utils';
12
13
 
13
14
  import {
@@ -29,7 +30,8 @@ export var debugStack = function(flag = true) {
29
30
  // ---------------------------------------------------------------------------
30
31
  export var CallStack = class CallStack {
31
32
  constructor() {
32
- this.reset();
33
+ this.lStack = [];
34
+ this.level = 0;
33
35
  }
34
36
 
35
37
  // ........................................................................
@@ -42,74 +44,70 @@ export var CallStack = class CallStack {
42
44
  }
43
45
 
44
46
  // ........................................................................
45
- addCall(funcName, hInfo, isLogged) {
46
- 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});
47
52
  if (isLogged) {
48
53
  this.level += 1;
49
54
  }
50
55
  }
51
56
 
52
57
  // ........................................................................
53
- removeCall(fName) {
54
- var funcName, hInfo, isLogged;
55
- ({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());
56
69
  if (isLogged && (this.level > 0)) {
57
70
  this.level -= 1;
58
71
  }
72
+ // --- This should do nothing
59
73
  while ((funcName !== fName) && (this.lStack.length > 0)) {
60
74
  LOG(`[MISSING RETURN FROM ${funcName} (return from ${fName})]`);
61
- ({funcName, hInfo, isLogged} = this.lStack.pop());
75
+ ({funcName, isLogged} = this.lStack.pop());
62
76
  if (isLogged && (this.level > 0)) {
63
77
  this.level -= 1;
64
78
  }
65
79
  }
66
- if (funcName === fName) {
67
- return hInfo;
68
- } else {
80
+ if (funcName !== fName) {
69
81
  this.dump();
70
82
  LOG(`BAD BAD BAD BAD returnFrom('${fName}')`);
71
- return undef;
72
83
  }
73
84
  }
74
85
 
75
86
  // ........................................................................
76
- // ........................................................................
77
- doCall(funcName, hInfo, isLogged) {
78
- var auxPre, mainPre, prefix;
79
- assert(isBoolean(isLogged), "CallStack.call(): 3 args required");
80
- mainPre = getPrefix(this.level);
81
- if (doDebugStack) {
82
- prefix = ' '.repeat(this.lStack.length);
83
- LOG(`${prefix}[--> CALL ${funcName}]`);
84
- }
85
- this.addCall(funcName, hInfo, isLogged);
86
- auxPre = getPrefix(this.level);
87
- return [mainPre, auxPre];
87
+ getLevel() {
88
+ return this.level;
88
89
  }
89
90
 
90
91
  // ........................................................................
91
- logStr() {
92
- var pre;
93
- pre = getPrefix(this.level);
94
- 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
+ }
95
98
  }
96
99
 
97
100
  // ........................................................................
98
- returnFrom(funcName) {
99
- var auxPre, hInfo, mainPre, prefix;
100
- // --- Prefixes are based on level before stack adjustment
101
- mainPre = getPrefix(this.level, 'withArrow');
102
- auxPre = getPrefix(this.level, 'returnVal');
103
- if (this.lStack.length === 0) {
104
- LOG(`returnFrom('${funcName}') but stack is empty`);
105
- return [mainPre, auxPre, undef];
106
- }
107
- hInfo = this.removeCall(funcName);
108
- if (doDebugStack) {
109
- prefix = ' '.repeat(this.lStack.length);
110
- 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
+ }
111
109
  }
112
- return [mainPre, auxPre, hInfo];
110
+ return false;
113
111
  }
114
112
 
115
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
+ };