recoil-toolkit
Version:
51 lines • 2.36 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { uniqueId } from '../_core';
import { tasks, taskById } from '../atoms';
import { pushTask, updateTaskDone, updateTaskError } from '../updaters';
import { cancelTask, createCancelled, createWaitFor } from './waitFor';
export const createFork = (parentId, recoil) => (taskCreator, args, debugKey) => {
/* child task id */
const id = uniqueId();
const cancelledChild = createCancelled(id);
const cancelled = () => recoil.cancelled() || cancelledChild();
const cancel = () => cancelTask(id);
const waitFor = createWaitFor(cancelled);
/* injected current snapshot */
const snapshot = recoil.getSnapshot();
const childRecoil = Object.assign(Object.assign({}, recoil), { snapshot,
waitFor,
cancelled });
/* injected fork recursively */
const fork = createFork(id, childRecoil);
const execute = taskCreator(Object.assign(Object.assign({}, childRecoil), { fork }));
const childTaskObj = {
parentId,
id,
args,
options: debugKey ? { key: debugKey } : undefined,
};
const taskRunner = () => __awaiter(void 0, void 0, void 0, function* () {
try {
recoil.set(tasks, pushTask(childTaskObj));
const data = yield execute(...args);
recoil.set(tasks, updateTaskDone({ data, id }));
return data;
}
catch (error) {
recoil.set(tasks, updateTaskError({ error, id }));
}
});
/* run child task */
const task = taskRunner();
const getTaskState = () => recoil.getLoadable(taskById(id)).getValue();
return { id, cancel, task, getTaskState };
};
//# sourceMappingURL=fork.js.map