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

doorstop.gui.store   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 41
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 29
dl 0
loc 41
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A Store.remove_observer() 0 2 1
A Store.dispatch() 0 7 3
A Store.state() 0 3 1
A Store.__init__() 0 4 1
A Store.add_observer() 0 3 1
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