Completed
Push — master ( c9a923...7591c0 )
by Karsten
03:22
created

DefaultPsiFactory::createSingleIterator()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 16
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 16
c 0
b 0
f 0
ccs 8
cts 8
cp 1
rs 9.2
cc 4
eloc 8
nc 4
nop 1
crap 4
1
<?php
2
/**
3
 * File was created 11.05.2015 07:05
4
 *
5
 * @author Karsten J. Gerber <[email protected]>
6
 */
7
8
namespace PeekAndPoke\Component\Psi;
9
10
use PeekAndPoke\Component\Psi\Exception\PsiException;
11
use PeekAndPoke\Component\Psi\Iterator\KeylessAppendIterator;
12
use PeekAndPoke\Component\Psi\Solver\DefaultOperationChainSolver;
13
14
/**
15
 * PsiFactory
16
 *
17
 * @author Karsten J. Gerber <[email protected]>
18
 */
19
class DefaultPsiFactory implements PsiFactory
20
{
21
    /**
22
     * {@inheritdoc}
23
     */
24 93
    public function createSolver()
25
    {
26 93
        return new DefaultOperationChainSolver();
27
    }
28
29
    /**
30
     * {@inheritdoc}
31
     */
32 105
    public function createIterator(array $iteratables, PsiOptions $options)
33
    {
34 105
        $count = count($iteratables);
35
36 105
        if ($count === 1) {
37 91
            return $this->createSingleIterator($iteratables[0]);
38
        }
39
40 14
        if ($count > 1) {
41
42
            // when we have multiple inputs we need an option to decide on how to deal with colliding keys
43 13
            if ($options->isPreserveKeysOfMultipleInputs()) {
44
                // this iterator return the original keys of each child iterator
45
                // -> this leads to conflicts OR means we preserve keys
46 2
                $iterator = new \AppendIterator();
47 2
            } else {
48
                // this iterator will create numeric keys from 0 .. n
49 11
                $iterator = new KeylessAppendIterator();
50
            }
51
52 13
            foreach ($iteratables as $iteratable) {
53
54 13
                $iterator->append(
55 13
                    $this->createSingleIterator($iteratable)
56 11
                );
57 11
            }
58
59 7
            return $iterator;
60
        }
61
62 1
        return new \ArrayIterator();
63
    }
64
65
    /**
66
     * @param mixed $iteratable
67
     *
68
     * @return \Iterator
69
     *
70
     * @throws PsiException
71
     */
72 104
    private function createSingleIterator($iteratable)
73
    {
74 104
        if ($iteratable === null) {
75 3
            return new \ArrayIterator();
76
        }
77
78 103
        if ($iteratable instanceof \Iterator) {
79 5
            return $iteratable;
80
        }
81
82 101
        if (is_array($iteratable)) {
83 96
            return new \ArrayIterator($iteratable);
84
        }
85
86 7
        throw new PsiException('Invalid input, not an array or an Iterator or a Traversable');
87
    }
88
}
89