Skip to content

Commit 37b84aa

Browse files
Add after action
1 parent d18898a commit 37b84aa

8 files changed

Lines changed: 277 additions & 9 deletions

File tree

‎src/main/java/com/abilityapi/sequenceapi/Sequence.java‎

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.abilityapi.sequenceapi;
22

33
import com.abilityapi.sequenceapi.action.Action;
4+
import com.abilityapi.sequenceapi.action.type.after.AfterAction;
45
import com.abilityapi.sequenceapi.action.type.observe.ObserverAction;
56
import com.abilityapi.sequenceapi.action.type.schedule.ScheduleAction;
67
import com.abilityapi.sequenceapi.util.EventComparator;
@@ -34,7 +35,7 @@ public static <E> EventComparator<Class<? extends E>, E> getComparatorAssignable
3435
private final int actionsSize;
3536

3637
private int index = 0;
37-
private long ticks = 0;
38+
private long scheduleTicks = 0;
3839
private long lastTime = System.currentTimeMillis();
3940
private State state = State.INACTIVE;
4041

@@ -111,18 +112,55 @@ public boolean applyObserve(final T event, final SequenceContext sequenceContext
111112
}
112113

113114
/**
114-
* Applies the next {@link ScheduleAction} in the {@link Sequence}
115+
* Applies the next {@link AfterAction} in the {@link Sequence}
115116
* with an appropriate {@link SequenceContext}.
116117
*
117118
* @param sequenceContext the sequence context
118119
* @return true if the action was successful and false if it was not
119120
*/
121+
public boolean applyAfter(final SequenceContext sequenceContext) {
122+
final ListIterator<Action> iterator = this.actions.listIterator();
123+
124+
if (iterator.hasNext()) {
125+
final Action rawAction = iterator.next();
126+
127+
final AfterAction action;
128+
if (rawAction instanceof AfterAction) {
129+
action = (AfterAction) rawAction;
130+
} else return false;
131+
132+
if (this.state.equals(State.INACTIVE)) this.state = State.ACTIVE;
133+
134+
final long current = System.currentTimeMillis();
135+
136+
if (!(this.lastTime + ((action.getDelay() / 20) * 1000) > current)) {
137+
this.index++;
138+
139+
iterator.remove();
140+
141+
if (!iterator.hasNext()) {
142+
if (this.index == this.actionsSize) this.state = State.FINISHED;
143+
}
144+
145+
return this.succeed(action, sequenceContext);
146+
}
147+
}
148+
149+
return false;
150+
}
151+
152+
/**
153+
* Applies the next {@link ScheduleAction} in the {@link Sequence}
154+
* with an appropriate {@link SequenceContext}.
155+
*
156+
* @param sequenceContext the sequence context
157+
*/
120158
public void applySchedule(final SequenceContext sequenceContext) {
121159
final ListIterator<Action> iterator = this.actions.listIterator();
122160

123161
if (this.state.equals(State.INACTIVE)) this.state = State.ACTIVE;
124162

125-
this.ticks++;
163+
this.scheduleTicks++;
126164

127165
if (iterator.hasNext()) {
128166
final Action rawAction = iterator.next();
@@ -138,7 +176,7 @@ public void applySchedule(final SequenceContext sequenceContext) {
138176

139177
// 1. Check that the tick is being executed in the period wanted.
140178

141-
if (action.getPeriod() != 0 && this.ticks % action.getPeriod() != 0) return;
179+
if (action.getPeriod() != 0 && this.scheduleTicks % action.getPeriod() != 0) return;
142180

143181
// 2. Fail the action if it is being executed before the delay.
144182

@@ -161,9 +199,8 @@ public void applySchedule(final SequenceContext sequenceContext) {
161199
return;
162200
}
163201

164-
// If this is a repeating task that will expire next tick OR a delayed task, remove it.
165-
if (action.getPeriod() == 0
166-
|| current + ((action.getPeriod() / 20) * 1000) > this.lastTime + ((action.getExpire() / 20) * 1000)) {
202+
// If this is a repeating task that will expire next tick remove it.
203+
if (current + ((action.getPeriod() / 20) * 1000) > this.lastTime + ((action.getExpire() / 20) * 1000)) {
167204
this.index++;
168205

169206
iterator.remove();

‎src/main/java/com/abilityapi/sequenceapi/SequenceBuilder.java‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.abilityapi.sequenceapi.action.Action;
44
import com.abilityapi.sequenceapi.action.ActionBuilder;
5+
import com.abilityapi.sequenceapi.action.type.after.AfterAction;
6+
import com.abilityapi.sequenceapi.action.type.after.AfterActionBuilder;
57
import com.abilityapi.sequenceapi.action.type.observe.ObserverAction;
68
import com.abilityapi.sequenceapi.action.type.observe.ObserverActionBlueprint;
79
import com.abilityapi.sequenceapi.action.type.observe.ObserverActionBuilder;
@@ -33,6 +35,18 @@ public ObserverActionBuilder<T> observe(final ObserverAction<T> action) {
3335
return new ObserverActionBuilder<>(this, action);
3436
}
3537

38+
@Override
39+
public AfterActionBuilder<T> after() {
40+
return this.after(new AfterAction());
41+
}
42+
43+
@Override
44+
public AfterActionBuilder<T> after(AfterAction action) {
45+
this.actions.add(action);
46+
47+
return new AfterActionBuilder<>(this, action);
48+
}
49+
3650
@Override
3751
public ScheduleActionBuilder<T> schedule() {
3852
return this.schedule(new ScheduleAction());

‎src/main/java/com/abilityapi/sequenceapi/SequenceManager.java‎

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void updateScheduler(final SequenceContext sequenceContext) {
109109
if (block.getElement().equals(sequence.getTrigger())) return true;
110110
}
111111

112-
return this._invokeScheduler(sequence, sequenceContext);
112+
return this._invokeScheduler(sequence, sequenceContext) && this._invokeAfter(sequence, sequenceContext);
113113
});
114114
}
115115

@@ -136,7 +136,7 @@ public void updateSchedulerIf(final SequenceContext sequenceContext, final Predi
136136

137137
if (!predicate.test(sequence)) return false;
138138

139-
return this._invokeScheduler(sequence, sequenceContext);
139+
return this._invokeScheduler(sequence, sequenceContext) && this._invokeAfter(sequence, sequenceContext);
140140
});
141141
}
142142

@@ -261,6 +261,32 @@ public boolean _invokeObserver(final T event, final Sequence<T> sequence, final
261261
return remove;
262262
}
263263

264+
public boolean _invokeAfter(final Sequence<T> sequence, final SequenceContext sequenceContext) {
265+
boolean remove = false;
266+
267+
// 1. Apply the sequence.
268+
269+
sequence.applyAfter(sequenceContext);
270+
271+
// 2. Check if the sequence is cancelled, or is expired.
272+
273+
final Sequence.State sequenceState = sequence.getState();
274+
275+
if (!sequenceState.isSafe()) {
276+
remove = true;
277+
}
278+
279+
// 3. Check if the sequence has finished and fire the hook and remove.
280+
281+
if (sequenceState.equals(Sequence.State.FINISHED)) {
282+
// Fire sequence finish hook.
283+
284+
remove = true;
285+
}
286+
287+
return remove;
288+
}
289+
264290
public boolean _invokeScheduler(final Sequence<T> sequence, final SequenceContext sequenceContext) {
265291
boolean remove = false;
266292

‎src/main/java/com/abilityapi/sequenceapi/action/ActionBuilder.java‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.abilityapi.sequenceapi.Sequence;
44
import com.abilityapi.sequenceapi.SequenceBlueprint;
55
import com.abilityapi.sequenceapi.SequenceContext;
6+
import com.abilityapi.sequenceapi.action.type.after.AfterAction;
7+
import com.abilityapi.sequenceapi.action.type.after.AfterActionBuilder;
68
import com.abilityapi.sequenceapi.action.type.observe.ObserverAction;
79
import com.abilityapi.sequenceapi.action.type.observe.ObserverActionBlueprint;
810
import com.abilityapi.sequenceapi.action.type.observe.ObserverActionBuilder;
@@ -42,6 +44,21 @@ public interface ActionBuilder<T> {
4244
*/
4345
ObserverActionBuilder<T> observe(final ObserverAction<T> action);
4446

47+
/**
48+
* Adds a new {@link AfterAction} to the {@link Sequence}.
49+
*
50+
* @return the after action builder
51+
*/
52+
AfterActionBuilder<T> after();
53+
54+
/**
55+
* Adds a new {@link AfterAction} to the {@link Sequence}.
56+
*
57+
* @param afterAction the after action
58+
* @return the after action builder
59+
*/
60+
AfterActionBuilder<T> after(final AfterAction afterAction);
61+
4562
/**
4663
* Adds a new {@link ScheduleAction} to the {@link Sequence}.
4764
*
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.abilityapi.sequenceapi.action.type.after;
2+
3+
import com.abilityapi.sequenceapi.SequenceContext;
4+
import com.abilityapi.sequenceapi.action.Action;
5+
import com.abilityapi.sequenceapi.action.condition.Condition;
6+
import com.abilityapi.sequenceapi.action.condition.ConditionType;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
public class AfterAction implements Action {
12+
13+
private List<Condition> conditions = new ArrayList<>();
14+
private int delay = 0;
15+
private int expire = 0;
16+
17+
@Override
18+
public void addCondition(final Condition condition) {
19+
this.conditions.add(condition);
20+
}
21+
22+
@Override
23+
public void setDelay(int period) {
24+
this.delay = period;
25+
}
26+
27+
@Override
28+
public void setExpire(int period) {
29+
this.expire = period;
30+
}
31+
32+
@Override
33+
public int getDelay() {
34+
return this.delay;
35+
}
36+
37+
@Override
38+
public int getExpire() {
39+
return this.expire;
40+
}
41+
42+
@Override
43+
public final boolean apply(final SequenceContext sequenceContext) {
44+
return this.conditions.stream()
45+
.filter(condition -> condition.getType().equals(ConditionType.NORMAL))
46+
.allMatch(condition -> condition.getSupplier().apply(sequenceContext));
47+
}
48+
49+
@Override
50+
public final boolean success(final SequenceContext sequenceContext) {
51+
return this.conditions.stream()
52+
.filter(condition -> condition.getType().equals(ConditionType.SUCCESS))
53+
.allMatch(condition -> condition.getSupplier().apply(sequenceContext));
54+
}
55+
56+
@Override
57+
public final boolean failure(final SequenceContext sequenceContext) {
58+
return this.conditions.stream()
59+
.filter(condition -> condition.getType().equals(ConditionType.FAIL))
60+
.anyMatch(condition -> condition.getSupplier().apply(sequenceContext));
61+
}
62+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.abilityapi.sequenceapi.action.type.after;
2+
3+
import com.abilityapi.sequenceapi.SequenceBlueprint;
4+
import com.abilityapi.sequenceapi.SequenceContext;
5+
import com.abilityapi.sequenceapi.action.ActionBuilder;
6+
import com.abilityapi.sequenceapi.action.condition.Condition;
7+
import com.abilityapi.sequenceapi.action.condition.ConditionSupplier;
8+
import com.abilityapi.sequenceapi.action.condition.ConditionType;
9+
import com.abilityapi.sequenceapi.action.type.observe.ObserverAction;
10+
import com.abilityapi.sequenceapi.action.type.observe.ObserverActionBlueprint;
11+
import com.abilityapi.sequenceapi.action.type.observe.ObserverActionBuilder;
12+
import com.abilityapi.sequenceapi.action.type.schedule.ScheduleAction;
13+
import com.abilityapi.sequenceapi.action.type.schedule.ScheduleActionBuilder;
14+
15+
public class AfterActionBuilder<T> implements ActionBuilder<T> {
16+
17+
private final ActionBuilder<T> sequenceBuilder;
18+
private final AfterAction action;
19+
20+
public AfterActionBuilder(final ActionBuilder<T> sequenceBuilder, AfterAction action) {
21+
this.sequenceBuilder = sequenceBuilder;
22+
this.action = action;
23+
}
24+
25+
/**
26+
* Adds a {@link Condition} to this {@link AfterAction}.
27+
*
28+
* @param conditionSupplier the condition supplier
29+
* @param conditionType the condition type
30+
* @return this builder
31+
*/
32+
public final AfterActionBuilder<T> condition(final ConditionSupplier conditionSupplier, final ConditionType conditionType) {
33+
this.action.addCondition(new Condition(conditionSupplier, conditionType));
34+
return this;
35+
}
36+
37+
/**
38+
* Sets a delay to this {@link AfterAction}.
39+
*
40+
* @param value the period of delay
41+
* @return this builder
42+
*/
43+
public final AfterActionBuilder<T> delay(final int value) {
44+
this.action.setDelay(value);
45+
this.action.setExpire(value + 1);
46+
return this;
47+
}
48+
49+
@Override
50+
public final ObserverActionBuilder<T> observe(final Class<? extends T> event) {
51+
return this.observe(new ObserverAction<>(event));
52+
}
53+
54+
@Override
55+
public final ObserverActionBuilder<T> observe(final ObserverActionBlueprint<T> actionBlueprint) {
56+
return this.observe(actionBlueprint.create());
57+
}
58+
59+
@Override
60+
public final ObserverActionBuilder<T> observe(final ObserverAction<T> action) {
61+
return this.sequenceBuilder.observe(action);
62+
}
63+
64+
@Override
65+
public AfterActionBuilder<T> after() {
66+
return this.after(new AfterAction());
67+
}
68+
69+
@Override
70+
public AfterActionBuilder<T> after(AfterAction afterAction) {
71+
return this.sequenceBuilder.after(afterAction);
72+
}
73+
74+
@Override
75+
public final ScheduleActionBuilder<T> schedule() {
76+
return this.schedule(new ScheduleAction());
77+
}
78+
79+
@Override
80+
public final ScheduleActionBuilder<T> schedule(final ScheduleAction scheduleAction) {
81+
return this.sequenceBuilder.schedule(scheduleAction);
82+
}
83+
84+
@Override
85+
public final SequenceBlueprint<T> build(final SequenceContext sequenceContext) {
86+
return this.sequenceBuilder.build(sequenceContext);
87+
}
88+
}

‎src/main/java/com/abilityapi/sequenceapi/action/type/observe/ObserverActionBuilder.java‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.abilityapi.sequenceapi.action.condition.Condition;
77
import com.abilityapi.sequenceapi.action.condition.ConditionSupplier;
88
import com.abilityapi.sequenceapi.action.condition.ConditionType;
9+
import com.abilityapi.sequenceapi.action.type.after.AfterAction;
10+
import com.abilityapi.sequenceapi.action.type.after.AfterActionBuilder;
911
import com.abilityapi.sequenceapi.action.type.schedule.ScheduleAction;
1012
import com.abilityapi.sequenceapi.action.type.schedule.ScheduleActionBuilder;
1113

@@ -73,6 +75,16 @@ public final ObserverActionBuilder<T> observe(final ObserverAction<T> action) {
7375
return this.sequenceBuilder.observe(action);
7476
}
7577

78+
@Override
79+
public AfterActionBuilder<T> after() {
80+
return this.after(new AfterAction());
81+
}
82+
83+
@Override
84+
public AfterActionBuilder<T> after(AfterAction afterAction) {
85+
return this.sequenceBuilder.after(afterAction);
86+
}
87+
7688
@Override
7789
public final ScheduleActionBuilder<T> schedule() {
7890
return this.schedule(new ScheduleAction());

0 commit comments

Comments
 (0)