@jdeighan/coffee-utils 7.0.50 → 7.0.51

Sign up to get free protection for your applications and to get access to all the features.
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
+ };