1 package org.opentrafficsim.road.gtu.lane.perception.categories.neighbors;
2
3 import java.util.function.Supplier;
4
5 import org.djunits.value.vdouble.scalar.Duration;
6 import org.djunits.value.vdouble.scalar.Length;
7 import org.djunits.value.vdouble.scalar.Speed;
8 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
9 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.Intermediate;
10 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.PerceptionAccumulator;
11 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.PerceptionCollector;
12 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.PerceptionFinalizer;
13
14
15
16
17
18
19
20
21
22
23
24
25 public class TaskHeadwayCollector implements PerceptionCollector<Duration, LaneBasedGTU, Duration>
26 {
27
28
29 private final Speed speed;
30
31
32
33
34
35 public TaskHeadwayCollector(final Speed speed)
36 {
37 this.speed = speed;
38 }
39
40
41 @Override
42 public Supplier<Duration> getIdentity()
43 {
44 return new Supplier<Duration>()
45 {
46 @Override
47 public Duration get()
48 {
49 return null;
50 }
51 };
52 }
53
54
55 @Override
56 public PerceptionAccumulator<LaneBasedGTU, Duration> getAccumulator()
57 {
58 return new PerceptionAccumulator<LaneBasedGTU, Duration>()
59 {
60 @SuppressWarnings("synthetic-access")
61 @Override
62 public Intermediate<Duration> accumulate(final Intermediate<Duration> intermediate, final LaneBasedGTU object,
63 final Length distance)
64 {
65 intermediate.setObject(distance.divideBy(TaskHeadwayCollector.this.speed));
66 intermediate.stop();
67 return intermediate;
68 }
69 };
70 }
71
72
73 @Override
74 public PerceptionFinalizer<Duration, Duration> getFinalizer()
75 {
76 return new PerceptionFinalizer<Duration, Duration>()
77 {
78 @Override
79 public Duration collect(final Duration intermediate)
80 {
81 return intermediate == null ? intermediate : (intermediate.gt0() ? intermediate : Duration.ZERO);
82 }
83 };
84 }
85
86 }