@jdeighan/coffee-utils 7.0.48 → 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.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
+ };