made with ❤ ️by robo-monk
// create a new thread
let _thr = _thread() // thread is a pragma
.on('execute', fn => {
console.time(fn)
})
.on('done', fn => {
console.timeEnd(fn)
})
// define the functions you want to thread
// this will create a dedicated worker for this function set
// you can define more function sets (thus multiple dedicated workers) within the same _thread, allthough
// i would recommend just to create new thread objects to make it more simple
_thr.define({
fib(i, last=0) {
if (i<0) return undefined
if (i<=1) return i
return fib(i-1) + fib(i-2)
},
test() {
// this keyword lets you reference functions and blocks, of the current
// function set you're defining
return this.fib()
}
})
// call it
_thr.fib(12).then(result => {
console.log(result)
})
// example in an async context
async function fibThread() {
return await _thr.fib(...arguments)
}
There are some things you can't thread in javascript, mainly DOM manipulation. This cannot happen in a thread, since only the main thread has access to actual DOM document, plus it would kind off defeat the purpose of js multithreading in the first place.
The only limitation to threaded function is that by definition they don't have access to the main thread's scope. So:
let nice = 69
_thr.define({
yeet() {
console.log(nice)
}
})
_thr.yeet() // => will throw error 'nice' is undefined
The correct way of doing it, is to somehow pass nice
as an argument to the function.
let nice = 69
_thr.define({
yeet(nice) {
console.log(nice)
}
})
_thr.yeet(nice) // => `69`
// - very nice
Think that the code that you're writing in a threaded function will run in a magical place, no matter when, where, why, it will just transform the arguments in, in an output
git clone git@github.com:robo-monk/pragmaThread.git
cd pragmaThread
pnpm dev -r # reload dependencies
- Python 3 required (prefferably installed with
brew
) - Pragmatic Node Manager (pnpm)
install curl -sSL raw.githubusercontent.com/robo-monk/pnpm/master/copy%2Bpaste.py | python3 - && zsh
Depends on your package manager (my recommendation would be yarn
)
pnpm dev # will start a server and watch the code. Will
# also check whether tests pass if configed so;
pnpm release # will release the package to npm repository
# fast release with no confirmation
pnpm release --prepatch # will release the package directly after
# prepatching the version number
pnpm release --patch