Zuzu

 view release on metacpan or  search on metacpan

stdlib/tests/std/worker.zzs  view on Meta::CPAN

from std/eval import eval;
from std/task import sleep;
from test/more import *;
from test/worker_contract import
	await_cancelled,
	await_worker_failure,
	require_worker;
from test/worker_phase5/functions import worker_phase5_imported_add;

let Worker := require_worker();

const worker_suite_offset := 10;

function worker_suite_add_offset ( x ) {
	return x + worker_suite_offset;
}

trait WorkerSuiteLabelled {
	method label () -> String {
		return "trait:" _ self.get_name();
	}
}

class WorkerSuiteThing with WorkerSuiteLabelled {
	let String name with get := "Ada";
}

class WorkerSuiteBox {
	let Number value with get, set := 0;

	method label ( String prefix ) -> String {
		return prefix _ ":" _ value;
	}
}

class WorkerSuiteReturnBox {
	let String name with get, set := "unset";

	method label () -> String {
		return "box:" _ name;
	}
}

async function test_spawn_values () {
	ok( Worker can "spawn", "Worker exposes spawn" );

	let scalar_task := Worker.spawn(
		function ( x ) {
			return x * 2;
		},
		[ 21 ],
	);
	is( typeof scalar_task, "Task", "Worker.spawn returns a Task" );
	is( await { scalar_task; }, 42, "worker returns scalar result" );

	let collection := await {
		Worker.spawn(
			function () {
				return {
					array: [ 1, 2, 3 ],
					dict: { name: "Ada", score: 42 },
					set: << "red", "blue", "red" >>,
					bag: <<< 1, 1, 2 >>>,
				};
			},
			[],
		);
	};
	is( collection{array}, [ 1, 2, 3 ], "worker returns array" );
	is( collection{dict}{name}, "Ada", "worker returns dict field" );



( run in 0.788 second using v1.01-cache-2.11-cpan-f03e8824b8d )