DefaultStorage   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 13
c 1
b 0
f 0
lcom 1
cbo 0
dl 0
loc 92
rs 10

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A createRange() 0 7 2
A attach() 0 6 2
A contains() 0 4 1
A detach() 0 6 2
A getRange() 0 9 2
A getAll() 0 5 1
A getUpperLimit() 0 9 2
1
<?php
2
/**
3
 * @author  Alexander Getmansky <[email protected]>
4
 * @package GetSky\RandomWinner
5
 */
6
namespace GetSky\RandomWinner;
7
8
9
use SplObjectStorage;
10
use Traversable;
11
12
class DefaultStorage implements MembersStorageInterface
13
{
14
15
    /**
16
     * @var SplObjectStorage
17
     */
18
    protected $members;
19
20
    public function __construct()
21
    {
22
        $this->members = new SplObjectStorage();
23
    }
24
25
    /**
26
     * @return void
27
     */
28
    protected function createRange()
29
    {
30
        $i = 0;
31
        foreach ($this->members as $member) {
32
            $this->members->offsetSet($member, [++$i, $i += $member->getChance() - 1]);
33
        }
34
    }
35
36
    /**
37
     * Attach member.
38
     * @param MemberInterface $member
39
     * @return void
40
     */
41
    public function attach(MemberInterface $member)
42
    {
43
        if (!$this->contains($member)) {
44
            $this->members->attach($member);
45
        }
46
    }
47
48
    /**
49
     * @param $member MemberInterface
50
     * @return bool
51
     */
52
    public function contains(MemberInterface $member)
53
    {
54
        return $this->members->contains($member);
55
    }
56
57
    /**
58
     * @param $member MemberInterface
59
     * @return void
60
     */
61
    public function detach(MemberInterface $member)
62
    {
63
        if ($this->contains($member)) {
64
            $this->members->detach($member);
65
        }
66
    }
67
68
    /**
69
     * @param MemberInterface $member
70
     * @return mixed|object
71
     */
72
    public function getRange(MemberInterface $member)
73
    {
74
        $range = $this->members->offsetGet($member);
75
        if ($range == null) {
76
            $this->createRange();
77
            return $this->members->offsetGet($member);
78
        }
79
        return $range;
80
    }
81
82
    /**
83
     * @return \Traversable
84
     */
85
    public function getAll()
86
    {
87
        $this->createRange();
88
        return $this->members;
89
    }
90
91
    /**
92
     * @return int
93
     */
94
    public function getUpperLimit()
95
    {
96
        $max = 0;
97
        foreach ($this->members as $member) {
98
            $max = $max + $member->getChance();
99
        }
100
101
        return $max;
102
    }
103
}
104