summaryrefslogtreecommitdiff
path: root/raveos-center/raveos_center/hatter.py
blob: 6c7349c9c142002a886ca14f22d21de26fe01357 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import time

from PyQt6.QtCore import QObject, QThreadPool, pyqtSignal


class _Jelzo(QObject):
    kesz = pyqtSignal(object)
    hiba = pyqtSignal(str)


_elo = set()


def hatterben(fuggveny, *args, kesz=None, hiba=None):
    jelzo = _Jelzo()
    _elo.add(jelzo)

    def vege(*_):
        _elo.discard(jelzo)

    if kesz:
        jelzo.kesz.connect(kesz)
    if hiba:
        jelzo.hiba.connect(hiba)
    jelzo.kesz.connect(vege)
    jelzo.hiba.connect(vege)

    def futas():
        try:
            eredmeny = fuggveny(*args)
        except BaseException as e:
            jelzo.hiba.emit(str(e) or type(e).__name__)
        else:
            jelzo.kesz.emit(eredmeny)

    QThreadPool.globalInstance().start(futas)


_tar = {}
_futok = {}
_generacio = {}


def _indit(kulcs, fuggveny, args, varok):
    generacio = _generacio.get(kulcs, 0)
    _futok[kulcs] = {"fuggveny": fuggveny, "args": args, "varok": varok}

    def vege(ertek):
        if _generacio.get(kulcs, 0) != generacio:
            return
        futo = _futok.pop(kulcs, None)
        regi = _tar.get(kulcs)
        _tar[kulcs] = (time.monotonic(), ertek)
        for k, _, kiszolgalva in futo["varok"] if futo else []:
            if k and (not kiszolgalva or regi is None or regi[1] != ertek):
                k(ertek)

    def hibas(uzenet):
        if _generacio.get(kulcs, 0) != generacio:
            return
        futo = _futok.pop(kulcs, None)
        for _, h, _ in futo["varok"] if futo else []:
            if h:
                h(uzenet)

    hatterben(fuggveny, *args, kesz=vege, hiba=hibas)


def gyorsitott(kulcs, fuggveny, *args, kesz=None, hiba=None, kor=60):
    meglevo = _tar.get(kulcs)
    if meglevo and kesz:
        kesz(meglevo[1])
    if meglevo and time.monotonic() - meglevo[0] < kor:
        return
    var = (kesz, hiba, meglevo is not None)
    if kulcs in _futok:
        _futok[kulcs]["varok"].append(var)
        return
    _indit(kulcs, fuggveny, args, [var])


def tarolt(kulcs):
    meglevo = _tar.get(kulcs)
    return meglevo[1] if meglevo else None


def ervenytelenit(*kulcsok):
    for kulcs in kulcsok or list(set(_tar) | set(_futok)):
        _tar.pop(kulcs, None)
        _generacio[kulcs] = _generacio.get(kulcs, 0) + 1
        futo = _futok.pop(kulcs, None)
        if futo:
            _indit(kulcs, futo["fuggveny"], futo["args"], [(k, h, False) for k, h, _ in futo["varok"]])


def leallitas(ido_ms=3000):
    _tar.clear()
    _futok.clear()
    pool = QThreadPool.globalInstance()
    pool.clear()
    pool.waitForDone(ido_ms)