Skip to content

Commit

Permalink
inject task id when bootstrapping
Browse files Browse the repository at this point in the history
  • Loading branch information
customcommander committed Jan 16, 2025
1 parent 1961a12 commit e51b6ad
Show file tree
Hide file tree
Showing 12 changed files with 154 additions and 137 deletions.
7 changes: 6 additions & 1 deletion src/bootstrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,12 @@ const src = setup({
const out = {...context.out, [id]: {...taskdefs[id]}};
const tasks = context.tasks.slice(1);
enqueue.assign({out, tasks});
enqueue.spawnChild(task, {systemId: `task-${id}`});
enqueue.spawnChild(task, {
systemId: `task-${id}`,
input: {
task_id: id
}
});
}),

notify: sendTo(
Expand Down
204 changes: 107 additions & 97 deletions src/lib-task2.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,13 @@ const service_not_implemented = fromPromise(() => {
throw new Error('service not implemented');
});

const update_game = sendTo(game, ({event}, {fn, ...params}) => ({
const update_game = sendTo(game, ({ event}, {fn, task_id, ...params}) => ({
type: 'game.update',
updater: produce(fn.bind(null, {event, params})),
updater: produce(fn.bind(null, {
task_id,
event,
params
})),
}));

const abort_task = sendTo(game, ({event}, {task_id, err}) => ({
Expand Down Expand Up @@ -41,16 +45,20 @@ export const game_updater = fn =>
},
})
.createMachine({
context: ({input}) => ({
task_id: input.task_id
}),
initial: 'execute',
states: {
execute: {
always: {
target: 'done',
actions: {
type: 'update_game',
params: {
params: ({context}) => ({
task_id: context.task_id,
fn
}
})
}
}
},
Expand All @@ -60,107 +68,109 @@ export const game_updater = fn =>
}
});

const task_setup = setup({
actors: {
fields: service_not_implemented,
replenish: service_not_implemented,
selected: service_not_implemented
},
actions: {
abort_task,
acknowledge_task,
complete_task
},
guards: {
is_todo
}
});


const task = task_id => task_setup.createMachine({
context: {
task_id,
},
initial: 'idle',
states: {
idle: {
on: {
'task.fields': {
target: 'fields'
},
'task.selected': {
target: 'selected'
},
'task.replenish': {
target: 'replenish',
}
}
const task =
setup({
actors: {
fields: service_not_implemented,
replenish: service_not_implemented,
selected: service_not_implemented
},
fields: {
invoke: {
src: 'fields',
onDone: {
target: 'idle',
actions: 'acknowledge_task'
}
}
actions: {
abort_task,
acknowledge_task,
complete_task
},
replenish: {
invoke: {
src: 'replenish',
onDone: {
target: 'idle',
actions: 'acknowledge_task'
guards: {
is_todo
}
})
.createMachine({
context: ({input}) => ({
task_id: input.task_id
}),
initial: 'idle',
states: {
idle: {
on: {
'task.fields': {
target: 'fields'
},
'task.selected': {
target: 'selected'
},
'task.replenish': {
target: 'replenish',
}
}
}
},
selected: {
invoke: {
src: 'selected',
input: ({context}) => ({
task_id: context.task_id
}),
onDone: [
{
guard: 'is_todo',
},
fields: {
invoke: {
src: 'fields',
input: ({context}) => ({
task_id: context.task_id
}),
onDone: {
target: 'idle',
actions: {
type: 'abort_task',
params: {
task_id,
err: 'TODO'
}
}
},
{
actions: 'acknowledge_task'
}
}
},
replenish: {
invoke: {
src: 'replenish',
input: ({context}) => ({
task_id: context.task_id
}),
onDone: {
target: 'idle',
actions: {
type: 'complete_task',
params: {
task_id
actions: 'acknowledge_task'
}
}
},
selected: {
invoke: {
src: 'selected',
input: ({context}) => ({
task_id: context.task_id
}),
onDone: [
{
guard: 'is_todo',
target: 'idle',
actions: {
type: 'abort_task',
params: ({context}) => ({
task_id: context.task_id,
err: 'TODO'
})
}
},
{
target: 'idle',
actions: {
type: 'complete_task',
params: ({context}) => ({
task_id: context.task_id
})
}
}
}
]
]
}
}
}
}
});

export default ({id, ...actors}) => {
const t = task(id);
return t.provide({
actors: Object.fromEntries(
Object.entries(actors).map(([k, v]) => {
if (typeof v == 'function') {
return [k, game_updater(v)];
}
if (v === 'TODO') {
return [k, todo];
}
return [k, v];
})
)
});
};

export default (actors) => task.provide({
actors: Object.fromEntries(
Object.entries(actors).map(([k, v]) => {
if (typeof v == 'function') {
return [k, game_updater(v)];
}
if (v === 'TODO') {
return [k, todo];
}
return [k, v];
})
)
});

2 changes: 1 addition & 1 deletion src/task-001.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import task from './lib-task2.js';

export default task({
id: '001',

fields: (_, game) => {
const ids = Object.keys(game.farmyard);

Expand Down
1 change: 0 additions & 1 deletion src/task-105.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ Implements the `1 Occupation` action space.
import task from './lib-task2.js';

export default task({
id: '105',
selected: 'TODO'
});

2 changes: 1 addition & 1 deletion src/task-106.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import task from './lib-task2.js';

export default task({
id: '106',

selected: (_, game) => {
game.supply.food += 2;
return game;
Expand Down
13 changes: 7 additions & 6 deletions src/task-107.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import task from './lib-task2.js';

export default task({
id: '107',
replenish: (_, game) => {
game.tasks['107'].quantity += 2;

replenish: ({task_id}, game) => {
game.tasks[task_id].quantity += 2;
return game;
},
selected: (_, game) => {
const {quantity} = game.tasks['107'];

selected: ({task_id}, game) => {
const {quantity} = game.tasks[task_id];
game.supply.wood += quantity;
game.tasks['107'].quantity = 0;
game.tasks[task_id].quantity = 0;
return game;
}
});
Expand Down
13 changes: 7 additions & 6 deletions src/task-108.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,16 @@ Take x CLay
import task from './lib-task2.js';

export default task({
id: '108',
replenish: (_, game) => {
game.tasks['108'].quantity += 1;

replenish: ({task_id}, game) => {
game.tasks[task_id].quantity += 1;
return game;
},
selected: (_, game) => {
const {quantity} = game.tasks['108'];

selected: ({task_id}, game) => {
const {quantity} = game.tasks[task_id];
game.supply.clay += quantity;
game.tasks['108'].quantity = 0;
game.tasks[task_id].quantity = 0;
return game;
}
});
Expand Down
13 changes: 7 additions & 6 deletions src/task-109.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@ Take x Reed
import task from './lib-task2.js';

export default task({
id: '109',
replenish: (_, game) => {
game.tasks[109].quantity += 1;

replenish: ({task_id}, game) => {
game.tasks[task_id].quantity += 1;
return game;
},
selected: (_, game) => {
const {quantity} = game.tasks[109];

selected: ({task_id}, game) => {
const {quantity} = game.tasks[task_id];
game.supply.reed += quantity;
game.tasks[109].quantity = 0;
game.tasks[task_id].quantity = 0;
return game;
}
});
Expand Down
13 changes: 7 additions & 6 deletions src/task-110.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@ Take x Food
import task from './lib-task2.js';

export default task({
id: '110',
replenish: (_, game) => {
game.tasks[110].quantity += 1;

replenish: ({task_id}, game) => {
game.tasks[task_id].quantity += 1;
return game;
},
selected: (_, game) => {
const {quantity} = game.tasks[110];

selected: ({task_id}, game) => {
const {quantity} = game.tasks[task_id];
game.supply.food += quantity;
game.tasks[110].quantity = 0;
game.tasks[task_id].quantity = 0;
return game;
}
});
Expand Down
7 changes: 4 additions & 3 deletions src/task-114.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
import task from './lib-task2.js';

export default task({
id: '114',
replenish: (_, game) => {
game.tasks[114].quantity += 1;

replenish: ({task_id}, game) => {
game.tasks[task_id].quantity += 1;
return game;
},

selected: 'TODO'
})

Expand Down
Loading

0 comments on commit e51b6ad

Please sign in to comment.