Skip to content

Instantly share code, notes, and snippets.

@DaengDo
Last active February 7, 2025 01:28
Show Gist options
  • Save DaengDo/91b7138c746d191b50fc7073d66649fc to your computer and use it in GitHub Desktop.
Save DaengDo/91b7138c746d191b50fc7073d66649fc to your computer and use it in GitHub Desktop.
type IOEvent =
| { type: "keyDown" | "keyUp"; keyCode: number }
| { type: "mouseDown" | "mouseUp"; mouseButton: number }
| { type: "mouseMove" | "mouseWheel"; x: number; y: number };
class IOEventListener {
private eventQueue = [] as IOEvent[];
private isRunning = false;
private eventQueueGenerator: Generator<undefined, void, unknown> | null = null;
dispatchIOEvent = (event: IOEvent) => {
if (!this.isRunning) return;
this.eventQueue.push(event);
this.eventQueueGenerator?.next();
};
*eventLoop() {
while (this.isRunning) {
const event = this.eventQueue[0] || { type: "null" };
this.eventQueue.shift();
switch (event.type) {
case "keyDown":
console.log("keyDown", event.keyCode);
break;
case "keyUp":
console.log("keyUp", event.keyCode);
break;
case "mouseDown":
console.log("mouseDown", event.mouseButton);
break;
case "mouseUp":
console.log("mouseUp", event.mouseButton);
break;
case "mouseMove":
console.log("mouseMove", event.x, event.y);
break;
case "mouseWheel":
console.log("mouseWheel", event.x, event.y);
break;
// 큐가 비어 있는 경우
default:
console.log("event not found", event);
}
yield;
}
}
run = () => {
if (this.isRunning) return;
this.isRunning = true;
this.eventQueueGenerator = this.eventLoop();
};
stop = () => {
this.isRunning = false;
this.eventQueueGenerator = null;
this.eventQueue = [];
};
}
function main() {
const eventListener = new IOEventListener();
eventListener.run();
eventListener.dispatchIOEvent({ type: "keyDown", keyCode: 65 });
eventListener.dispatchIOEvent({ type: "keyUp", keyCode: 65 });
eventListener.dispatchIOEvent({ type: "keyDown", keyCode: 66 });
eventListener.dispatchIOEvent({ type: "keyUp", keyCode: 66 });
eventListener.stop();
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment