43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
import asyncio
|
|
from functools import wraps
|
|
from enum import IntEnum
|
|
|
|
|
|
def async_debounce(wait):
|
|
def decorator(func):
|
|
task: asyncio.Task | None = None
|
|
|
|
@wraps(func)
|
|
async def debounced(*args, **kwargs):
|
|
nonlocal task
|
|
if task and not task.done():
|
|
return
|
|
|
|
async def call_func():
|
|
await asyncio.sleep(wait)
|
|
await func(*args, **kwargs)
|
|
|
|
task = asyncio.create_task(call_func())
|
|
return task
|
|
|
|
return debounced
|
|
|
|
return decorator
|
|
|
|
|
|
class OutputMatch(IntEnum):
|
|
"""Enum for how an output was matched to a workspace group
|
|
|
|
This is used to break ties between contexts that have the same compatibility score. Output name matching
|
|
is considered weaker than matching by make, model, and serial number, however, it is generic and can be used
|
|
to match, say, projectors in conference rooms.
|
|
|
|
NO_MATCH: The output was not matched to the workspace group
|
|
NAME_MATCH: The output was matched by name to the workspace group
|
|
ID_MATCH: The output was matched by its make, model, and serial number to the workspace group
|
|
"""
|
|
|
|
NO_MATCH = 0
|
|
NAME_MATCH = 1
|
|
ID_MATCH = 2
|