Passed
Pull Request — develop (#301)
by
unknown
01:51
created

doorstop.gui.store.Store.add_observer()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nop 2
1
#!/usr/bin/env python
2
3
from typing import Optional
4
from typing import Callable
5
from typing import List  # noqa  # pylint: disable=unused-import
6
7
from doorstop import common
8
9
from doorstop.gui.action import Action
10
from doorstop.gui.state import State
11
from doorstop.gui.reducer import Reducer
12
13
log = common.logger(__name__)
14
15
16
class Store():
17
18
    @property
19
    def state(self) -> Optional[State]:
20
        return self.__state
21
22
    def __init__(self, reducer: Reducer, initial_state: Optional[State] = None) -> None:
23
        self.__observer = []  # type: List[Callable[["Store"], None]]
24
        self.__state = initial_state
25
        self.__reducer = reducer
26
27
    def add_observer(self, observer: Callable[["Store"], None]) -> None:
28
        self.__observer.append(observer)
29
        observer(self)
30
31
    def remove_observer(self, observer: Callable[["Store"], None]) -> None:
32
        self.__observer.remove(observer)
33
34
    def dispatch(self, action: Action) -> None:
35
        new_state = self.__reducer.reduce(self.state, action)
36
        if new_state != self.__state:
37
            log.info(action.__class__.__name__)
38
            self.__state = new_state
39
            for curr_observer in self.__observer:
40
                curr_observer(self)
41