Code Duplication    Length = 285-285 lines in 5 locations

src/Date/DateInterval.php 1 location

@@ 19-303 (lines=285) @@
16
use GpsLab\Component\Interval\IntervalPointInterface;
17
use GpsLab\Component\Interval\IntervalType;
18
19
class DateInterval implements ComparableIntervalInterface
20
{
21
    /**
22
     * @var string
23
     */
24
    const REGEXP = '/^
25
        (?:\(|\[)                   # start type char
26
        \s*
27
        (?<start>\d{4}-\d{2}-\d{2}) # start point
28
        \s*,\s*                     # separator
29
        (?<end>\d{4}-\d{2}-\d{2})   # end point
30
        \s*
31
        (?:\)|\])                   # end type char
32
    $/x';
33
34
    /**
35
     * @var IntervalType
36
     */
37
    private $type;
38
39
    /**
40
     * @var IntervalComparator
41
     */
42
    private $comparator;
43
44
    /**
45
     * @var DateIntervalPoint
46
     */
47
    private $start;
48
49
    /**
50
     * @var DateIntervalPoint
51
     */
52
    private $end;
53
54
    /**
55
     * @param DateIntervalPoint $start
56
     * @param DateIntervalPoint $end
57
     * @param IntervalType $type
58
     */
59
    private function __construct(DateIntervalPoint $start, DateIntervalPoint $end, IntervalType $type)
60
    {
61
        if ($start->gte($end)) {
62
            throw IncorrectIntervalException::create();
63
        }
64
65
        $this->type = $type;
66
        $this->start = $start;
67
        $this->end = $end;
68
        $this->comparator = new IntervalComparator($this);
69
    }
70
71
    /**
72
     * @param \DateTime $start
73
     * @param \DateTime $end
74
     * @param IntervalType $type
75
     *
76
     * @return self
77
     */
78
    public static function create(\DateTime $start, \DateTime $end, IntervalType $type)
79
    {
80
        return new self(new DateIntervalPoint($start), new DateIntervalPoint($end), $type);
81
    }
82
83
    /**
84
     * @param \DateTime $start
85
     * @param \DateTime $end
86
     *
87
     * @return self
88
     */
89
    public static function closed(\DateTime $start, \DateTime $end)
90
    {
91
        return static::create($start, $end, IntervalType::closed());
92
    }
93
94
    /**
95
     * @param \DateTime $start
96
     * @param \DateTime $end
97
     *
98
     * @return self
99
     */
100
    public static function halfClosed(\DateTime $start, \DateTime $end)
101
    {
102
        return static::create($start, $end, IntervalType::halfClosed());
103
    }
104
105
    /**
106
     * @param \DateTime $start
107
     * @param \DateTime $end
108
     *
109
     * @return self
110
     */
111
    public static function halfOpen(\DateTime $start, \DateTime $end)
112
    {
113
        return static::create($start, $end, IntervalType::halfOpen());
114
    }
115
116
    /**
117
     * @param \DateTime $start
118
     * @param \DateTime $end
119
     *
120
     * @return self
121
     */
122
    public static function open(\DateTime $start, \DateTime $end)
123
    {
124
        return static::create($start, $end, IntervalType::open());
125
    }
126
127
    /**
128
     * Create interval from string.
129
     *
130
     * Example formats for all interval types:
131
     *   [2016-12-09, 2016-12-21]
132
     *   (2015-03-07, 2015-10-19]
133
     *   [2014-09-11, 2015-02-08)
134
     *   (2013-10-27, 2013-10-30)
135
     *
136
     * Spaces are ignored in format.
137
     *
138
     * @param string $string
139
     *
140
     * @return self
141
     */
142
    public static function fromString($string)
143
    {
144
        if (!preg_match(self::REGEXP, $string, $match)) {
145
            throw InvalidIntervalFormatException::create('[YYYY-MM-DD, YYYY-MM-DD]', $string);
146
        }
147
148
        return self::create(
149
            new \DateTime($match['start']),
150
            new \DateTime($match['end']),
151
            IntervalType::fromString($string)
152
        );
153
    }
154
155
    /**
156
     * @param DateInterval $interval
157
     *
158
     * @return bool
159
     */
160
    public function equal(DateInterval $interval)
161
    {
162
        return $this->comparator->equal($interval);
163
    }
164
165
    /**
166
     * @param \DateTime $point
167
     *
168
     * @return bool
169
     */
170
    public function contains(\DateTime $point)
171
    {
172
        return $this->comparator->contains(new DateIntervalPoint($point));
173
    }
174
175
    /**
176
     * @param DateInterval $interval
177
     * @param bool $check_interval_type
178
     *
179
     * @return bool
180
     */
181
    public function intersects(DateInterval $interval, $check_interval_type = true)
182
    {
183
        return $this->comparator->intersects($interval, $check_interval_type);
184
    }
185
186
    /**
187
     * @param DateInterval $interval
188
     *
189
     * @return DateInterval|null
190
     */
191
    public function intersection(DateInterval $interval)
192
    {
193
        return $this->comparator->intersection($interval);
194
    }
195
196
    /**
197
     * The point is before the interval.
198
     *
199
     * @param \DateTime $point
200
     *
201
     * @return bool
202
     */
203
    public function before(\DateTime $point)
204
    {
205
        return $this->comparator->before(new DateIntervalPoint($point));
206
    }
207
208
    /**
209
     * The point is after the interval.
210
     *
211
     * @param \DateTime $point
212
     *
213
     * @return bool
214
     */
215
    public function after(\DateTime $point)
216
    {
217
        return $this->comparator->after(new DateIntervalPoint($point));
218
    }
219
220
    /**
221
     * @return IntervalType
222
     */
223
    public function type()
224
    {
225
        return $this->type;
226
    }
227
228
    /**
229
     * @return \DateTime
230
     */
231
    public function start()
232
    {
233
        return $this->start->value();
234
    }
235
236
    /**
237
     * @return \DateTime
238
     */
239
    public function end()
240
    {
241
        return $this->end->value();
242
    }
243
244
    /**
245
     * @return DateIntervalPoint
246
     */
247
    public function startPoint()
248
    {
249
        return $this->start;
250
    }
251
252
    /**
253
     * @return DateIntervalPoint
254
     */
255
    public function endPoint()
256
    {
257
        return $this->end;
258
    }
259
260
    /**
261
     * Returns a copy of this Interval with the start point altered.
262
     *
263
     * @param IntervalPointInterface|DateIntervalPoint $start
264
     *
265
     * @return self
266
     */
267
    public function withStart(IntervalPointInterface $start)
268
    {
269
        return new self($start, $this->end, $this->type);
270
    }
271
272
    /**
273
     * Returns a copy of this Interval with the end point altered.
274
     *
275
     * @param IntervalPointInterface|DateIntervalPoint $end
276
     *
277
     * @return self
278
     */
279
    public function withEnd(IntervalPointInterface $end)
280
    {
281
        return new self($this->start, $end, $this->type);
282
    }
283
284
    /**
285
     * Returns a copy of this Interval with the interval type altered.
286
     *
287
     * @param IntervalType $type
288
     *
289
     * @return self
290
     */
291
    public function withType(IntervalType $type)
292
    {
293
        return new self($this->start, $this->end, $type);
294
    }
295
296
    /**
297
     * @return string
298
     */
299
    public function __toString()
300
    {
301
        return $this->type->getReadable($this);
302
    }
303
}
304

src/DateTime/DateTimeInterval.php 1 location

@@ 19-303 (lines=285) @@
16
use GpsLab\Component\Interval\IntervalPointInterface;
17
use GpsLab\Component\Interval\IntervalType;
18
19
class DateTimeInterval implements ComparableIntervalInterface
20
{
21
    /**
22
     * @var string
23
     */
24
    const REGEXP = '/^
25
        (?:\(|\[)                                       # start type char
26
        \s*
27
        (?<start>\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}) # start point
28
        \s*,\s*                                         # separator
29
        (?<end>\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})   # end point
30
        \s*
31
        (?:\)|\])                                       # end type char
32
    $/x';
33
34
    /**
35
     * @var IntervalType
36
     */
37
    private $type;
38
39
    /**
40
     * @var IntervalComparator
41
     */
42
    private $comparator;
43
44
    /**
45
     * @var DateTimeIntervalPoint
46
     */
47
    private $start;
48
49
    /**
50
     * @var DateTimeIntervalPoint
51
     */
52
    private $end;
53
54
    /**
55
     * @param DateTimeIntervalPoint $start
56
     * @param DateTimeIntervalPoint $end
57
     * @param IntervalType $type
58
     */
59
    private function __construct(DateTimeIntervalPoint $start, DateTimeIntervalPoint $end, IntervalType $type)
60
    {
61
        if ($start->gte($end)) {
62
            throw IncorrectIntervalException::create();
63
        }
64
65
        $this->type = $type;
66
        $this->start = $start;
67
        $this->end = $end;
68
        $this->comparator = new IntervalComparator($this);
69
    }
70
71
    /**
72
     * @param \DateTime $start
73
     * @param \DateTime $end
74
     * @param IntervalType $type
75
     *
76
     * @return self
77
     */
78
    public static function create(\DateTime $start, \DateTime $end, IntervalType $type)
79
    {
80
        return new self(new DateTimeIntervalPoint($start), new DateTimeIntervalPoint($end), $type);
81
    }
82
83
    /**
84
     * @param \DateTime $start
85
     * @param \DateTime $end
86
     *
87
     * @return self
88
     */
89
    public static function closed(\DateTime $start, \DateTime $end)
90
    {
91
        return static::create($start, $end, IntervalType::closed());
92
    }
93
94
    /**
95
     * @param \DateTime $start
96
     * @param \DateTime $end
97
     *
98
     * @return self
99
     */
100
    public static function halfClosed(\DateTime $start, \DateTime $end)
101
    {
102
        return static::create($start, $end, IntervalType::halfClosed());
103
    }
104
105
    /**
106
     * @param \DateTime $start
107
     * @param \DateTime $end
108
     *
109
     * @return self
110
     */
111
    public static function halfOpen(\DateTime $start, \DateTime $end)
112
    {
113
        return static::create($start, $end, IntervalType::halfOpen());
114
    }
115
116
    /**
117
     * @param \DateTime $start
118
     * @param \DateTime $end
119
     *
120
     * @return self
121
     */
122
    public static function open(\DateTime $start, \DateTime $end)
123
    {
124
        return static::create($start, $end, IntervalType::open());
125
    }
126
127
    /**
128
     * Create interval from string.
129
     *
130
     * Example formats for all interval types:
131
     *   [2016-12-09 02:55:00, 2016-12-21 12:30:12]
132
     *   (2015-03-07 12:04:45, 2015-10-19 19:38:14]
133
     *   [2014-09-11 17:31:09, 2015-02-08 23:45:58)
134
     *   (2013-10-27 15:03:37, 2013-10-30 05:06:34)
135
     *
136
     * Spaces are ignored in format.
137
     *
138
     * @param string $string
139
     *
140
     * @return self
141
     */
142
    public static function fromString($string)
143
    {
144
        if (!preg_match(self::REGEXP, $string, $match)) {
145
            throw InvalidIntervalFormatException::create('[YYYY-MM-DD HH:II:SS, YYYY-MM-DD HH:II:SS]', $string);
146
        }
147
148
        return self::create(
149
            new \DateTime($match['start']),
150
            new \DateTime($match['end']),
151
            IntervalType::fromString($string)
152
        );
153
    }
154
155
    /**
156
     * @param DateTimeInterval $interval
157
     *
158
     * @return bool
159
     */
160
    public function equal(DateTimeInterval $interval)
161
    {
162
        return $this->comparator->equal($interval);
163
    }
164
165
    /**
166
     * @param \DateTime $point
167
     *
168
     * @return bool
169
     */
170
    public function contains(\DateTime $point)
171
    {
172
        return $this->comparator->contains(new DateTimeIntervalPoint($point));
173
    }
174
175
    /**
176
     * @param DateTimeInterval $interval
177
     * @param bool $check_interval_type
178
     *
179
     * @return bool
180
     */
181
    public function intersects(DateTimeInterval $interval, $check_interval_type = true)
182
    {
183
        return $this->comparator->intersects($interval, $check_interval_type);
184
    }
185
186
    /**
187
     * @param DateTimeInterval $interval
188
     *
189
     * @return DateTimeInterval|null
190
     */
191
    public function intersection(DateTimeInterval $interval)
192
    {
193
        return $this->comparator->intersection($interval);
194
    }
195
196
    /**
197
     * The point is before the interval.
198
     *
199
     * @param \DateTime $point
200
     *
201
     * @return bool
202
     */
203
    public function before(\DateTime $point)
204
    {
205
        return $this->comparator->before(new DateTimeIntervalPoint($point));
206
    }
207
208
    /**
209
     * The point is after the interval.
210
     *
211
     * @param \DateTime $point
212
     *
213
     * @return bool
214
     */
215
    public function after(\DateTime $point)
216
    {
217
        return $this->comparator->after(new DateTimeIntervalPoint($point));
218
    }
219
220
    /**
221
     * @return IntervalType
222
     */
223
    public function type()
224
    {
225
        return $this->type;
226
    }
227
228
    /**
229
     * @return \DateTime
230
     */
231
    public function start()
232
    {
233
        return $this->start->value();
234
    }
235
236
    /**
237
     * @return \DateTime
238
     */
239
    public function end()
240
    {
241
        return $this->end->value();
242
    }
243
244
    /**
245
     * @return DateTimeIntervalPoint
246
     */
247
    public function startPoint()
248
    {
249
        return $this->start;
250
    }
251
252
    /**
253
     * @return DateTimeIntervalPoint
254
     */
255
    public function endPoint()
256
    {
257
        return $this->end;
258
    }
259
260
    /**
261
     * Returns a copy of this Interval with the start point altered.
262
     *
263
     * @param IntervalPointInterface|DateTimeIntervalPoint $start
264
     *
265
     * @return self
266
     */
267
    public function withStart(IntervalPointInterface $start)
268
    {
269
        return new self($start, $this->end, $this->type);
270
    }
271
272
    /**
273
     * Returns a copy of this Interval with the end point altered.
274
     *
275
     * @param IntervalPointInterface|DateTimeIntervalPoint $end
276
     *
277
     * @return self
278
     */
279
    public function withEnd(IntervalPointInterface $end)
280
    {
281
        return new self($this->start, $end, $this->type);
282
    }
283
284
    /**
285
     * Returns a copy of this Interval with the interval type altered.
286
     *
287
     * @param IntervalType $type
288
     *
289
     * @return self
290
     */
291
    public function withType(IntervalType $type)
292
    {
293
        return new self($this->start, $this->end, $type);
294
    }
295
296
    /**
297
     * @return string
298
     */
299
    public function __toString()
300
    {
301
        return $this->type->getReadable($this);
302
    }
303
}
304

src/Month/MonthInterval.php 1 location

@@ 20-304 (lines=285) @@
17
use GpsLab\Component\Interval\IntervalPointInterface;
18
use GpsLab\Component\Interval\IntervalType;
19
20
class MonthInterval implements ComparableIntervalInterface
21
{
22
    /**
23
     * @var string
24
     */
25
    const REGEXP = '/^
26
        (?:\(|\[)              # start type char
27
        \s*
28
        (?<start>\d{4}\/\d{2}) # start point
29
        \s*,\s*                # separator
30
        (?<end>\d{4}\/\d{2})   # end point
31
        \s*
32
        (?:\)|\])              # end type char
33
    $/x';
34
35
    /**
36
     * @var IntervalType
37
     */
38
    private $type;
39
40
    /**
41
     * @var IntervalComparator
42
     */
43
    private $comparator;
44
45
    /**
46
     * @var MonthIntervalPoint
47
     */
48
    private $start;
49
50
    /**
51
     * @var MonthIntervalPoint
52
     */
53
    private $end;
54
55
    /**
56
     * @param MonthIntervalPoint $start
57
     * @param MonthIntervalPoint $end
58
     * @param IntervalType $type
59
     */
60
    private function __construct(MonthIntervalPoint $start, MonthIntervalPoint $end, IntervalType $type)
61
    {
62
        if ($start->gte($end)) {
63
            throw IncorrectIntervalException::create();
64
        }
65
66
        $this->type = $type;
67
        $this->start = $start;
68
        $this->end = $end;
69
        $this->comparator = new IntervalComparator($this);
70
    }
71
72
    /**
73
     * @param \DateTime $start
74
     * @param \DateTime $end
75
     * @param IntervalType $type
76
     *
77
     * @return self
78
     */
79
    public static function create(\DateTime $start, \DateTime $end, IntervalType $type)
80
    {
81
        return new self(new MonthIntervalPoint($start), new MonthIntervalPoint($end), $type);
82
    }
83
84
    /**
85
     * @param \DateTime $start
86
     * @param \DateTime $end
87
     *
88
     * @return self
89
     */
90
    public static function closed(\DateTime $start, \DateTime $end)
91
    {
92
        return static::create($start, $end, IntervalType::closed());
93
    }
94
95
    /**
96
     * @param \DateTime $start
97
     * @param \DateTime $end
98
     *
99
     * @return self
100
     */
101
    public static function halfClosed(\DateTime $start, \DateTime $end)
102
    {
103
        return static::create($start, $end, IntervalType::halfClosed());
104
    }
105
106
    /**
107
     * @param \DateTime $start
108
     * @param \DateTime $end
109
     *
110
     * @return self
111
     */
112
    public static function halfOpen(\DateTime $start, \DateTime $end)
113
    {
114
        return static::create($start, $end, IntervalType::halfOpen());
115
    }
116
117
    /**
118
     * @param \DateTime $start
119
     * @param \DateTime $end
120
     *
121
     * @return self
122
     */
123
    public static function open(\DateTime $start, \DateTime $end)
124
    {
125
        return static::create($start, $end, IntervalType::open());
126
    }
127
128
    /**
129
     * Create interval from string.
130
     *
131
     * Example formats for all interval types:
132
     *   [2016/12, 2016/12]
133
     *   (2015/03, 2015/10]
134
     *   [2014/09, 2015/02)
135
     *   (2013/10, 2013/10)
136
     *
137
     * Spaces are ignored in format.
138
     *
139
     * @param string $string
140
     *
141
     * @return self
142
     */
143
    public static function fromString($string)
144
    {
145
        if (!preg_match(self::REGEXP, $string, $match)) {
146
            throw InvalidIntervalFormatException::create('[YYYY/MM, YYYY/MM]', $string);
147
        }
148
149
        return self::create(
150
            new \DateTime($match['start'].'/01'),
151
            new \DateTime($match['end'].'/01'),
152
            IntervalType::fromString($string)
153
        );
154
    }
155
156
    /**
157
     * @param MonthInterval $interval
158
     *
159
     * @return bool
160
     */
161
    public function equal(MonthInterval $interval)
162
    {
163
        return $this->comparator->equal($interval);
164
    }
165
166
    /**
167
     * @param \DateTime $point
168
     *
169
     * @return bool
170
     */
171
    public function contains(\DateTime $point)
172
    {
173
        return $this->comparator->contains(new MonthIntervalPoint($point));
174
    }
175
176
    /**
177
     * @param MonthInterval $interval
178
     * @param bool $check_interval_type
179
     *
180
     * @return bool
181
     */
182
    public function intersects(MonthInterval $interval, $check_interval_type = true)
183
    {
184
        return $this->comparator->intersects($interval, $check_interval_type);
185
    }
186
187
    /**
188
     * @param MonthInterval $interval
189
     *
190
     * @return MonthInterval|null
191
     */
192
    public function intersection(MonthInterval $interval)
193
    {
194
        return $this->comparator->intersection($interval);
195
    }
196
197
    /**
198
     * The point is before the interval.
199
     *
200
     * @param \DateTime $point
201
     *
202
     * @return bool
203
     */
204
    public function before(\DateTime $point)
205
    {
206
        return $this->comparator->before(new MonthIntervalPoint($point));
207
    }
208
209
    /**
210
     * The point is after the interval.
211
     *
212
     * @param \DateTime $point
213
     *
214
     * @return bool
215
     */
216
    public function after(\DateTime $point)
217
    {
218
        return $this->comparator->after(new MonthIntervalPoint($point));
219
    }
220
221
    /**
222
     * @return IntervalType
223
     */
224
    public function type()
225
    {
226
        return $this->type;
227
    }
228
229
    /**
230
     * @return \DateTime
231
     */
232
    public function start()
233
    {
234
        return $this->start->value();
235
    }
236
237
    /**
238
     * @return \DateTime
239
     */
240
    public function end()
241
    {
242
        return $this->end->value();
243
    }
244
245
    /**
246
     * @return MonthIntervalPoint
247
     */
248
    public function startPoint()
249
    {
250
        return $this->start;
251
    }
252
253
    /**
254
     * @return MonthIntervalPoint
255
     */
256
    public function endPoint()
257
    {
258
        return $this->end;
259
    }
260
261
    /**
262
     * Returns a copy of this Interval with the start point altered.
263
     *
264
     * @param IntervalPointInterface|MonthIntervalPoint $start
265
     *
266
     * @return self
267
     */
268
    public function withStart(IntervalPointInterface $start)
269
    {
270
        return new self($start, $this->end, $this->type);
271
    }
272
273
    /**
274
     * Returns a copy of this Interval with the end point altered.
275
     *
276
     * @param IntervalPointInterface|MonthIntervalPoint $end
277
     *
278
     * @return self
279
     */
280
    public function withEnd(IntervalPointInterface $end)
281
    {
282
        return new self($this->start, $end, $this->type);
283
    }
284
285
    /**
286
     * Returns a copy of this Interval with the interval type altered.
287
     *
288
     * @param IntervalType $type
289
     *
290
     * @return self
291
     */
292
    public function withType(IntervalType $type)
293
    {
294
        return new self($this->start, $this->end, $type);
295
    }
296
297
    /**
298
     * @return string
299
     */
300
    public function __toString()
301
    {
302
        return $this->type->getReadable($this);
303
    }
304
}
305

src/Time/TimeInterval.php 1 location

@@ 20-304 (lines=285) @@
17
use GpsLab\Component\Interval\IntervalPointInterface;
18
use GpsLab\Component\Interval\IntervalType;
19
20
class TimeInterval implements ComparableIntervalInterface
21
{
22
    /**
23
     * @var string
24
     */
25
    const REGEXP = '/^
26
        (?:\(|\[)                   # start type char
27
        \s*
28
        (?<start>\d{2}:\d{2}:\d{2}) # start point
29
        \s*,\s*                     # separator
30
        (?<end>\d{2}:\d{2}:\d{2})   # end point
31
        \s*
32
        (?:\)|\])                   # end type char
33
    $/x';
34
35
    /**
36
     * @var IntervalType
37
     */
38
    private $type;
39
40
    /**
41
     * @var IntervalComparator
42
     */
43
    private $comparator;
44
45
    /**
46
     * @var TimeIntervalPoint
47
     */
48
    private $start;
49
50
    /**
51
     * @var TimeIntervalPoint
52
     */
53
    private $end;
54
55
    /**
56
     * @param TimeIntervalPoint $start
57
     * @param TimeIntervalPoint $end
58
     * @param IntervalType $type
59
     */
60
    private function __construct(TimeIntervalPoint $start, TimeIntervalPoint $end, IntervalType $type)
61
    {
62
        if ($start->gte($end)) {
63
            throw IncorrectIntervalException::create();
64
        }
65
66
        $this->type = $type;
67
        $this->start = $start;
68
        $this->end = $end;
69
        $this->comparator = new IntervalComparator($this);
70
    }
71
72
    /**
73
     * @param \DateTime $start
74
     * @param \DateTime $end
75
     * @param IntervalType $type
76
     *
77
     * @return self
78
     */
79
    public static function create(\DateTime $start, \DateTime $end, IntervalType $type)
80
    {
81
        return new self(new TimeIntervalPoint($start), new TimeIntervalPoint($end), $type);
82
    }
83
84
    /**
85
     * @param \DateTime $start
86
     * @param \DateTime $end
87
     *
88
     * @return self
89
     */
90
    public static function closed(\DateTime $start, \DateTime $end)
91
    {
92
        return static::create($start, $end, IntervalType::closed());
93
    }
94
95
    /**
96
     * @param \DateTime $start
97
     * @param \DateTime $end
98
     *
99
     * @return self
100
     */
101
    public static function halfClosed(\DateTime $start, \DateTime $end)
102
    {
103
        return static::create($start, $end, IntervalType::halfClosed());
104
    }
105
106
    /**
107
     * @param \DateTime $start
108
     * @param \DateTime $end
109
     *
110
     * @return self
111
     */
112
    public static function halfOpen(\DateTime $start, \DateTime $end)
113
    {
114
        return static::create($start, $end, IntervalType::halfOpen());
115
    }
116
117
    /**
118
     * @param \DateTime $start
119
     * @param \DateTime $end
120
     *
121
     * @return self
122
     */
123
    public static function open(\DateTime $start, \DateTime $end)
124
    {
125
        return static::create($start, $end, IntervalType::open());
126
    }
127
128
    /**
129
     * Create interval from string.
130
     *
131
     * Example formats for all interval types:
132
     *   [02:55:00, 12:30:12]
133
     *   (12:04:45, 19:38:14]
134
     *   [17:31:09, 23:45:58)
135
     *   (15:03:37, 15:06:34)
136
     *
137
     * Spaces are ignored in format.
138
     *
139
     * @param string $string
140
     *
141
     * @return self
142
     */
143
    public static function fromString($string)
144
    {
145
        if (!preg_match(self::REGEXP, $string, $match)) {
146
            throw InvalidIntervalFormatException::create('[HH:II:SS, HH:II:SS]', $string);
147
        }
148
149
        return self::create(
150
            new \DateTime($match['start']),
151
            new \DateTime($match['end']),
152
            IntervalType::fromString($string)
153
        );
154
    }
155
156
    /**
157
     * @param TimeInterval $interval
158
     *
159
     * @return bool
160
     */
161
    public function equal(TimeInterval $interval)
162
    {
163
        return $this->comparator->equal($interval);
164
    }
165
166
    /**
167
     * @param \DateTime $point
168
     *
169
     * @return bool
170
     */
171
    public function contains(\DateTime $point)
172
    {
173
        return $this->comparator->contains(new TimeIntervalPoint($point));
174
    }
175
176
    /**
177
     * @param TimeInterval $interval
178
     * @param bool $check_interval_type
179
     *
180
     * @return bool
181
     */
182
    public function intersects(TimeInterval $interval, $check_interval_type = true)
183
    {
184
        return $this->comparator->intersects($interval, $check_interval_type);
185
    }
186
187
    /**
188
     * @param TimeInterval $interval
189
     *
190
     * @return TimeInterval|null
191
     */
192
    public function intersection(TimeInterval $interval)
193
    {
194
        return $this->comparator->intersection($interval);
195
    }
196
197
    /**
198
     * The point is before the interval.
199
     *
200
     * @param \DateTime $point
201
     *
202
     * @return bool
203
     */
204
    public function before(\DateTime $point)
205
    {
206
        return $this->comparator->before(new TimeIntervalPoint($point));
207
    }
208
209
    /**
210
     * The point is after the interval.
211
     *
212
     * @param \DateTime $point
213
     *
214
     * @return bool
215
     */
216
    public function after(\DateTime $point)
217
    {
218
        return $this->comparator->after(new TimeIntervalPoint($point));
219
    }
220
221
    /**
222
     * @return IntervalType
223
     */
224
    public function type()
225
    {
226
        return $this->type;
227
    }
228
229
    /**
230
     * @return \DateTime
231
     */
232
    public function start()
233
    {
234
        return $this->start->value();
235
    }
236
237
    /**
238
     * @return \DateTime
239
     */
240
    public function end()
241
    {
242
        return $this->end->value();
243
    }
244
245
    /**
246
     * @return TimeIntervalPoint
247
     */
248
    public function startPoint()
249
    {
250
        return $this->start;
251
    }
252
253
    /**
254
     * @return TimeIntervalPoint
255
     */
256
    public function endPoint()
257
    {
258
        return $this->end;
259
    }
260
261
    /**
262
     * Returns a copy of this Interval with the start point altered.
263
     *
264
     * @param IntervalPointInterface|TimeIntervalPoint $start
265
     *
266
     * @return self
267
     */
268
    public function withStart(IntervalPointInterface $start)
269
    {
270
        return new self($start, $this->end, $this->type);
271
    }
272
273
    /**
274
     * Returns a copy of this Interval with the end point altered.
275
     *
276
     * @param IntervalPointInterface|TimeIntervalPoint $end
277
     *
278
     * @return self
279
     */
280
    public function withEnd(IntervalPointInterface $end)
281
    {
282
        return new self($this->start, $end, $this->type);
283
    }
284
285
    /**
286
     * Returns a copy of this Interval with the interval type altered.
287
     *
288
     * @param IntervalType $type
289
     *
290
     * @return self
291
     */
292
    public function withType(IntervalType $type)
293
    {
294
        return new self($this->start, $this->end, $type);
295
    }
296
297
    /**
298
     * @return string
299
     */
300
    public function __toString()
301
    {
302
        return $this->type->getReadable($this);
303
    }
304
}
305

src/Week/WeekInterval.php 1 location

@@ 20-304 (lines=285) @@
17
use GpsLab\Component\Interval\IntervalPointInterface;
18
use GpsLab\Component\Interval\IntervalType;
19
20
class WeekInterval implements ComparableIntervalInterface
21
{
22
    /**
23
     * @var string
24
     */
25
    const REGEXP = '/^
26
        (?:\(|\[)                   # start type char
27
        \s*
28
        (?<start>\d{4}-\d{2}-\d{2}) # start point
29
        \s*,\s*                     # separator
30
        (?<end>\d{4}-\d{2}-\d{2})   # end point
31
        \s*
32
        (?:\)|\])                   # end type char
33
    $/x';
34
35
    /**
36
     * @var IntervalType
37
     */
38
    private $type;
39
40
    /**
41
     * @var IntervalComparator
42
     */
43
    private $comparator;
44
45
    /**
46
     * @var WeekIntervalPoint
47
     */
48
    private $start;
49
50
    /**
51
     * @var WeekIntervalPoint
52
     */
53
    private $end;
54
55
    /**
56
     * @param WeekIntervalPoint $start
57
     * @param WeekIntervalPoint $end
58
     * @param IntervalType $type
59
     */
60
    private function __construct(WeekIntervalPoint $start, WeekIntervalPoint $end, IntervalType $type)
61
    {
62
        if ($start->gte($end)) {
63
            throw IncorrectIntervalException::create();
64
        }
65
66
        $this->type = $type;
67
        $this->start = $start;
68
        $this->end = $end;
69
        $this->comparator = new IntervalComparator($this);
70
    }
71
72
    /**
73
     * @param \DateTime $start
74
     * @param \DateTime $end
75
     * @param IntervalType $type
76
     *
77
     * @return self
78
     */
79
    public static function create(\DateTime $start, \DateTime $end, IntervalType $type)
80
    {
81
        return new self(new WeekIntervalPoint($start), new WeekIntervalPoint($end), $type);
82
    }
83
84
    /**
85
     * @param \DateTime $start
86
     * @param \DateTime $end
87
     *
88
     * @return self
89
     */
90
    public static function closed(\DateTime $start, \DateTime $end)
91
    {
92
        return static::create($start, $end, IntervalType::closed());
93
    }
94
95
    /**
96
     * @param \DateTime $start
97
     * @param \DateTime $end
98
     *
99
     * @return self
100
     */
101
    public static function halfClosed(\DateTime $start, \DateTime $end)
102
    {
103
        return static::create($start, $end, IntervalType::halfClosed());
104
    }
105
106
    /**
107
     * @param \DateTime $start
108
     * @param \DateTime $end
109
     *
110
     * @return self
111
     */
112
    public static function halfOpen(\DateTime $start, \DateTime $end)
113
    {
114
        return static::create($start, $end, IntervalType::halfOpen());
115
    }
116
117
    /**
118
     * @param \DateTime $start
119
     * @param \DateTime $end
120
     *
121
     * @return self
122
     */
123
    public static function open(\DateTime $start, \DateTime $end)
124
    {
125
        return static::create($start, $end, IntervalType::open());
126
    }
127
128
    /**
129
     * Create interval from string.
130
     *
131
     * Example formats for all interval types:
132
     *   [2016-12-09, 2016-12-21]
133
     *   (2015-03-07, 2015-10-19]
134
     *   [2014-09-11, 2015-02-08)
135
     *   (2013-10-02, 2013-10-30)
136
     *
137
     * Spaces are ignored in format.
138
     *
139
     * @param string $string
140
     *
141
     * @return self
142
     */
143
    public static function fromString($string)
144
    {
145
        if (!preg_match(self::REGEXP, $string, $match)) {
146
            throw InvalidIntervalFormatException::create('[YYYY-MM-DD, YYYY-MM-DD]', $string);
147
        }
148
149
        return self::create(
150
            new \DateTime($match['start']),
151
            new \DateTime($match['end']),
152
            IntervalType::fromString($string)
153
        );
154
    }
155
156
    /**
157
     * @param WeekInterval $interval
158
     *
159
     * @return bool
160
     */
161
    public function equal(WeekInterval $interval)
162
    {
163
        return $this->comparator->equal($interval);
164
    }
165
166
    /**
167
     * @param \DateTime $point
168
     *
169
     * @return bool
170
     */
171
    public function contains(\DateTime $point)
172
    {
173
        return $this->comparator->contains(new WeekIntervalPoint($point));
174
    }
175
176
    /**
177
     * @param WeekInterval $interval
178
     * @param bool $check_interval_type
179
     *
180
     * @return bool
181
     */
182
    public function intersects(WeekInterval $interval, $check_interval_type = true)
183
    {
184
        return $this->comparator->intersects($interval, $check_interval_type);
185
    }
186
187
    /**
188
     * @param WeekInterval $interval
189
     *
190
     * @return WeekInterval|null
191
     */
192
    public function intersection(WeekInterval $interval)
193
    {
194
        return $this->comparator->intersection($interval);
195
    }
196
197
    /**
198
     * The point is before the interval.
199
     *
200
     * @param \DateTime $point
201
     *
202
     * @return bool
203
     */
204
    public function before(\DateTime $point)
205
    {
206
        return $this->comparator->before(new WeekIntervalPoint($point));
207
    }
208
209
    /**
210
     * The point is after the interval.
211
     *
212
     * @param \DateTime $point
213
     *
214
     * @return bool
215
     */
216
    public function after(\DateTime $point)
217
    {
218
        return $this->comparator->after(new WeekIntervalPoint($point));
219
    }
220
221
    /**
222
     * @return IntervalType
223
     */
224
    public function type()
225
    {
226
        return $this->type;
227
    }
228
229
    /**
230
     * @return \DateTime
231
     */
232
    public function start()
233
    {
234
        return $this->start->value();
235
    }
236
237
    /**
238
     * @return \DateTime
239
     */
240
    public function end()
241
    {
242
        return $this->end->value();
243
    }
244
245
    /**
246
     * @return WeekIntervalPoint
247
     */
248
    public function startPoint()
249
    {
250
        return $this->start;
251
    }
252
253
    /**
254
     * @return WeekIntervalPoint
255
     */
256
    public function endPoint()
257
    {
258
        return $this->end;
259
    }
260
261
    /**
262
     * Returns a copy of this Interval with the start point altered.
263
     *
264
     * @param IntervalPointInterface|WeekIntervalPoint $start
265
     *
266
     * @return self
267
     */
268
    public function withStart(IntervalPointInterface $start)
269
    {
270
        return new self($start, $this->end, $this->type);
271
    }
272
273
    /**
274
     * Returns a copy of this Interval with the end point altered.
275
     *
276
     * @param IntervalPointInterface|WeekIntervalPoint $end
277
     *
278
     * @return self
279
     */
280
    public function withEnd(IntervalPointInterface $end)
281
    {
282
        return new self($this->start, $end, $this->type);
283
    }
284
285
    /**
286
     * Returns a copy of this Interval with the interval type altered.
287
     *
288
     * @param IntervalType $type
289
     *
290
     * @return self
291
     */
292
    public function withType(IntervalType $type)
293
    {
294
        return new self($this->start, $this->end, $type);
295
    }
296
297
    /**
298
     * @return string
299
     */
300
    public function __toString()
301
    {
302
        return $this->type->getReadable($this);
303
    }
304
}
305