Passed
Push — master ( f6a8a8...2149f7 )
by Max
45s
created

structured_data._patterns   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 48
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 30
dl 0
loc 48
rs 10
c 0
b 0
f 0
wmc 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A AsPattern.__new__() 0 4 2
A Pattern.__matmul__() 0 2 1
A AsPattern.matcher() 0 4 1
A AsPattern.match() 0 4 1
A Pattern.__new__() 0 8 4
A Pattern.name() 0 4 1
1
import keyword
2
3
DISCARD = object()
4
5
6
class Pattern(tuple):
7
    """A matcher that binds a value to a name."""
8
9
    __slots__ = ()
10
11
    def __new__(cls, name: str):
12
        if name == '_':
13
            return DISCARD
14
        if not name.isidentifier():
15
            raise ValueError
16
        if keyword.iskeyword(name):
17
            raise ValueError
18
        return super().__new__(cls, (name,))
19
20
    @property
21
    def name(self):
22
        """Return the name of the matcher."""
23
        return self[0]
24
25
    def __matmul__(self, other):
26
        return AsPattern(self, other)
27
28
29
class AsPattern(tuple):
30
    """A matcher that contains further bindings."""
31
32
    __slots__ = ()
33
34
    def __new__(cls, matcher: Pattern, match):
35
        if match is DISCARD:
36
            return matcher
37
        return super().__new__(cls, (matcher, match))
38
39
    @property
40
    def matcher(self):
41
        """Return the left-hand-side of the as-match."""
42
        return self[0]
43
44
    @property
45
    def match(self):
46
        """Return the right-hand-side of the as-match."""
47
        return self[1]
48