@rip-lang/swarm 1.2.3 → 1.2.4

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/swarm.rip +28 -30
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rip-lang/swarm",
3
- "version": "1.2.3",
3
+ "version": "1.2.4",
4
4
  "description": "Parallel job runner with worker threads — setup once, swarm many",
5
5
  "type": "module",
6
6
  "main": "swarm.rip",
package/swarm.rip CHANGED
@@ -94,19 +94,18 @@ bg = (rgb) -> if rgb then "\x1b[48;2;#{hex(rgb)}m" else "\x1b[49m"
94
94
  # Progress display
95
95
  # ==============================================================================
96
96
 
97
- _char = _wide = _len = null
97
+ char = wide = len = null
98
98
 
99
99
  drawFrame = (workers) ->
100
- _len = String(workers).length
100
+ len = String(workers).length
101
101
  write clear()
102
- write go(2 + workers, _len + 3) + "╰" + "─".repeat(_wide + 2) + "╯"
103
- write go(1, _len + 3) + "╭" + "─".repeat(_wide + 2) + "╮"
102
+ write go(2 + workers, len + 3) + "╰" + "─".repeat(wide + 2) + "╯"
103
+ write go(1, len + 3) + "╭" + "─".repeat(wide + 2) + "╮"
104
104
  for i in [0...workers]
105
105
  write go(i + 2, 1)
106
- label = String(i + 1).padStart(_len)
107
- write " #{label} │ " + " ".repeat(_wide) + " │"
108
- # summary bar row
109
- write go(workers + 3, _len + 3) + "│ " + " ".repeat(_wide) + " │"
106
+ label = String(i + 1).padStart(len)
107
+ write " #{label} │ " + " ".repeat(wide) + " │"
108
+ write go(workers + 3, len + 3) + "│ " + " ".repeat(wide) + " │"
110
109
 
111
110
  draw = (state) ->
112
111
  { live, done, died, jobs, workers, info } = state
@@ -117,27 +116,29 @@ draw = (state) ->
117
116
  # worker bars
118
117
  for slot, count of info
119
118
  tpct = count / most
120
- cols = Math.floor(ppct * tpct * _wide)
121
- write go(parseInt(slot) + 1, _len + 5) + bg("5383ec") + _char.repeat(cols) + bg()
119
+ cols = Math.floor(ppct * tpct * wide)
120
+ write go(parseInt(slot) + 1, len + 5) + bg("5383ec") + char.repeat(cols) + bg()
122
121
 
123
122
  # summary bar
124
123
  dpct = done / jobs
125
124
  lpct = live / jobs
126
- gcol = Math.floor(dpct * _wide)
127
- ycol = Math.floor(lpct * _wide)
128
- rcol = Math.max(0, _wide - gcol - ycol)
125
+ gcol = Math.floor(dpct * wide)
126
+ ycol = Math.floor(lpct * wide)
127
+ rcol = Math.max(0, wide - gcol - ycol)
129
128
  row = workers + 3
130
129
 
131
- write go(row, _len + 5)
132
- write fg("fff")
133
- write bg("58a65c") + _char.repeat(gcol) # green (done)
134
- write bg("f1bf42") + _char.repeat(ycol) # yellow (live)
135
- write bg("d85140") + " ".repeat(rcol) # red (rest)
136
- write go(row, _len + 5 + _wide + 3)
137
- write bg("5383ec") + " #{(ppct * 100).toFixed(1)}% "
138
- write bg() + " " + bg("58a65c") + " #{done}/#{jobs} done " if done > 0
139
- write bg() + " " + bg("d85140") + " #{died} died " if died > 0
140
- write fg() + bg()
130
+ out = [
131
+ go(row, len + 5)
132
+ fg("fff")
133
+ bg("58a65c") + char.repeat(gcol) # green (done)
134
+ bg("f1bf42") + char.repeat(ycol) # yellow (live)
135
+ bg("d85140") + " ".repeat(rcol) # red (rest)
136
+ go(row, len + 5 + wide + 3)
137
+ bg("5383ec") + " #{(ppct * 100).toFixed(1)}% " # blue (pct)
138
+ if done > 0 then bg() + " " + bg("58a65c") + " #{done}/#{jobs} done "
139
+ if died > 0 then bg() + " " + bg("d85140") + " #{died} died "
140
+ ].filter(Boolean).join('') + fg() + bg()
141
+ write out
141
142
 
142
143
  # ==============================================================================
143
144
  # Worker orchestration
@@ -157,8 +158,8 @@ export swarm = (opts = {}) ->
157
158
  # parse CLI options
158
159
  args = process.argv.slice(2)
159
160
  workers = parseInt(findArg(args, '-w', '--workers')) or opts.workers or cpus().length
160
- barw = parseInt(findArg(args, '-b', '--bar')) or opts.bar or 20
161
- char = findArg(args, '-c', '--char') or opts.char or '•'
161
+ wide = parseInt(findArg(args, '-b', '--bar')) or opts.bar or 20
162
+ char = (findArg(args, '-c', '--char') or opts.char or '•')[0]
162
163
  doreset = args.includes('-r') or args.includes('--reset')
163
164
  dosafe = args.includes('-s') or args.includes('--safe')
164
165
 
@@ -166,9 +167,6 @@ export swarm = (opts = {}) ->
166
167
  console.error 'error: workers must be at least 1'
167
168
  process.exit(1)
168
169
 
169
- _wide = barw
170
- _char = char[0]
171
-
172
170
  if doreset
173
171
  rmSync(_dir, { recursive: true, force: true })
174
172
  console.log 'removed .swarm directory'
@@ -256,7 +254,7 @@ export swarm = (opts = {}) ->
256
254
  taskPath = tasks[taskIdx++]
257
255
  inflight[slot] = taskPath
258
256
  live++
259
- write go(slot + 1, _len + 5 + _wide + 3) + " " + taskPath.split('/').pop() + clear(true)
257
+ write go(slot + 1, len + 5 + wide + 3) + " " + taskPath.split('/').pop() + clear(true)
260
258
  draw({ live, done, died, jobs, workers, info })
261
259
  worker.postMessage { type: 'task', taskPath }
262
260
  else
@@ -327,7 +325,7 @@ export swarm = (opts = {}) ->
327
325
  s = parseInt(slot)
328
326
  n = info[slot]
329
327
  rate = if secs > 0 then (n / secs).toFixed(1) else '—'
330
- write go(s + 1, _len + 5) + bg("5383ec") + _char.repeat(_wide) + bg() + " │ #{n} jobs @ #{rate}/sec" + clear(true)
328
+ write go(s + 1, len + 5) + bg("5383ec") + char.repeat(wide) + bg() + " │ #{n} jobs @ #{rate}/sec" + clear(true)
331
329
  draw({ live: 0, done, died, jobs, workers, info })
332
330
 
333
331
  # summary