55 lines
1.2 KiB
TypeScript
55 lines
1.2 KiB
TypeScript
// @ts-nocheck
|
|
|
|
// 来自kux大佬的神之一手
|
|
// 原地址 https://ext.dcloud.net.cn/plugin?id=23291
|
|
export type ControlCommand = 'continue' | 'break' | null;
|
|
|
|
export type ControllableWhileReturn = {
|
|
start: () => void;
|
|
abort: () => void;
|
|
execContinue: () => 'continue';
|
|
execBreak: () => 'break';
|
|
};
|
|
|
|
export type Controller = {
|
|
abort: () => void;
|
|
};
|
|
|
|
export function controllableWhile(
|
|
condition : () => boolean,
|
|
body: (controller: Controller) => ControlCommand
|
|
): ControllableWhileReturn {
|
|
let isActive = true;
|
|
|
|
const controller: Controller = {
|
|
abort: () => {
|
|
isActive = false;
|
|
}
|
|
};
|
|
|
|
const execContinue = () => 'continue';
|
|
const execBreak = () => 'break';
|
|
|
|
return {
|
|
start: () => {
|
|
// #ifdef APP-ANDROID
|
|
UTSAndroid.getDispatcher('io').async((_) => {
|
|
// #endif
|
|
while (isActive && condition()) {
|
|
const result = body(controller);
|
|
if (result == 'break') {
|
|
controller.abort();
|
|
break;
|
|
} else if (result == 'continue') {
|
|
continue;
|
|
}
|
|
}
|
|
// #ifdef APP-ANDROID
|
|
}, null);
|
|
// #endif
|
|
},
|
|
abort: controller.abort,
|
|
execContinue: execContinue,
|
|
execBreak: execBreak
|
|
} as ControllableWhileReturn;
|
|
} |