···11+import { Task } from './task.ts';
22+import { StreamTask } from './stream-task.ts';
33+import type { WorkerHandle } from './runner.ts';
44+55+/**
66+ * Returns a copy of the task pinned to a specific worker.
77+ * The original task is unchanged.
88+ * @param worker - The worker handle to pin the task to.
99+ * @param task - The task or streaming task to assign.
1010+ * @returns A new task with the same id and args, pinned to the given worker.
1111+ */
1212+export function assign<T>(worker: WorkerHandle, task: Task<T>): Task<T>;
1313+export function assign<T>(worker: WorkerHandle, task: StreamTask<T>): StreamTask<T>;
1414+export function assign(worker: WorkerHandle, task: Task<any> | StreamTask<any>): Task<any> | StreamTask<any> {
1515+ if (task instanceof StreamTask) {
1616+ const copy = new StreamTask(task.id, task.args);
1717+ copy.worker = worker;
1818+ return copy;
1919+ }
2020+ const copy = new Task(task.id, task.args);
2121+ copy.worker = worker;
2222+ return copy;
2323+}
+1
src/index.ts
···66export type { ChannelOptions } from './channel.ts';
77export { workers } from './worker-pool.ts';
88export { transfer } from './transfer.ts';
99+export { assign } from './assign.ts';
910export type { Runner, WorkerHandle, WorkerOptions } from './runner.ts';
1011export {
1112 shared,
+33
test/assign.test.ts
···11+import { describe, it } from 'node:test';
22+import assert from 'node:assert/strict';
33+import { mo, workers, assign } from 'moroutine';
44+55+const double = mo(import.meta, (n: number): number => n * 2);
66+77+describe('assign()', () => {
88+ it('returns a new task with worker set', () => {
99+ const run = workers(1);
1010+ try {
1111+ const task = double(5);
1212+ const assigned = assign(run.workers[0], task);
1313+ assert.notStrictEqual(assigned, task);
1414+ assert.equal(assigned.id, task.id);
1515+ assert.deepEqual(assigned.args, task.args);
1616+ assert.notEqual(assigned.uid, task.uid);
1717+ assert.equal(assigned.worker, run.workers[0]);
1818+ } finally {
1919+ run[Symbol.dispose]();
2020+ }
2121+ });
2222+2323+ it('does not modify the original task', () => {
2424+ const run = workers(1);
2525+ try {
2626+ const task = double(5);
2727+ assign(run.workers[0], task);
2828+ assert.equal(task.worker, undefined);
2929+ } finally {
3030+ run[Symbol.dispose]();
3131+ }
3232+ });
3333+});