index.ts 1.14 KB
// 来自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;
}