Completed
Push — develop ( 797efa...09c0f5 )
by Stuart
01:50
created

ExtractFirstItem::fromTraversable()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
rs 9.4285
cc 2
eloc 4
nc 2
nop 2
1
<?php
2
3
/**
4
 * Copyright (c) 2016-present Ganbaro Digital Ltd
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 *
11
 *   * Redistributions of source code must retain the above copyright
12
 *     notice, this list of conditions and the following disclaimer.
13
 *
14
 *   * Redistributions in binary form must reproduce the above copyright
15
 *     notice, this list of conditions and the following disclaimer in
16
 *     the documentation and/or other materials provided with the
17
 *     distribution.
18
 *
19
 *   * Neither the names of the copyright holders nor the names of his
20
 *     contributors may be used to endorse or promote products derived
21
 *     from this software without specific prior written permission.
22
 *
23
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
 * POSSIBILITY OF SUCH DAMAGE.
35
 *
36
 * @category  Libraries
37
 * @package   ArrayTools/Filters
38
 * @author    Stuart Herbert <[email protected]>
39
 * @copyright 2016-present Ganbaro Digital Ltd www.ganbarodigital.com
40
 * @license   http://www.opensource.org/licenses/bsd-license.php  BSD License
41
 * @link      http://code.ganbarodigital.com/php-array-tools
42
 */
43
44
namespace GanbaroDigital\ArrayTools\Filters;
45
46
use GanbaroDigital\Reflection\Maps\MapTypeToMethod;
47
use Traversable;
48
49
class ExtractFirstItem
50
{
51
    /**
52
     * extract the first item from a dataset
53
     *
54
     * @param  mixed $data
55
     *         the data to filter
56
     * @param  mixed $default
57
     *         the data to return when we cannot filter $data
58
     * @return mixed
59
     */
60
    public function __invoke($data, $default)
61
    {
62
        return self::from($data, $default);
63
    }
64
65
    /**
66
     * extract the first item from a dataset
67
     *
68
     * @param  mixed $data
69
     *         the data to filter
70
     * @param  mixed $default
71
     *         the data to return when we cannot filter $data
72
     * @return mixed
73
     */
74
    public static function from($data, $default)
75
    {
76
        $method = MapTypeToMethod::using($data, self::$dispatchMap);
77
        return self::$method($data, $default);
78
    }
79
80
    /**
81
     * extract the first item from a dataset held in a string
82
     *
83
     * we take a very simplistic approach here, and assume that the string
84
     * contains space-separated data
85
     *
86
     * @param  string $data
87
     *         the data to filter
88
     * @param  mixed $default
89
     *         the data to return when we cannot filter $data
90
     * @return mixed
91
     */
92
    private static function fromString($data, $default)
93
    {
94
        // special case - $data is empty
95
        if (trim($data) === '') {
96
            return $default;
97
        }
98
99
        // treat it as a whitespace-separated string
100
        $parts = explode(' ', $data);
101
        return self::fromTraversable($parts, $default);
102
    }
103
104
    /**
105
     * extract the first item from a dataset
106
     *
107
     * @param  array|Traversable $data
108
     *         the data to filter
109
     * @param  mixed $default
110
     *         the data to return when we cannot filter $data
111
     * @return mixed
112
     */
113
    private static function fromTraversable($data, $default)
114
    {
115
        // return the first item available in $data
116
        //
117
        // we use a foreach() loop here because it is compatible with
118
        // both arrays and iterators
119
        foreach ($data as $item) {
120
            return $item;
121
        }
122
123
        // if we get here, then $data was empty
124
        return $default;
125
    }
126
127
    /**
128
     * called when we've been given a data type we do not support
129
     *
130
     * @param  mixed $data
131
     *         the data to filter
132
     * @param  mixed $default
133
     *         the data to return when we cannot filter $data
134
     * @return mixed
135
     */
136
    private static function nothingMatchesTheInputType($data, $default)
0 ignored issues
show
Unused Code introduced by
The parameter $data is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
137
    {
138
        return $default;
139
    }
140
141
    /**
142
     * lookup map of how to convert which data type
143
     *
144
     * @var array
145
     */
146
    private static $dispatchMap = [
147
        'String' => 'fromString',
148
        'Traversable' => 'fromTraversable'
149
    ];
150
}
151