Skip to content

Commit a7a4cdb

Browse files
committed
Observer to receive data throughout the simulation. #14
1 parent 1c3ee0f commit a7a4cdb

21 files changed

+323
-264
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Added
55
* `runState` getter to determine whether the simulation has not started, is running, or has completed.
66
* `stop` method to manually stop the simulation before it completes.
7+
* Observer to receive data throughout the simulation.
78

89
## 0.2.0
910

README.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
It is designed to model and simulate systems where events occur at discrete points in time,
1010
allowing for the analysis of complex processes and workflows.
1111

12-
Explore and learn more by clicking [here](https://simdart.github.io/simdart-demo/).
13-
1412
## Why Dart?
1513

1614
[Dart](https://dart.dev/) was chosen for this project due to its fast execution, single-threaded nature, and ease of use.
@@ -125,7 +123,7 @@ import 'package:simdart/simdart.dart';
125123
void main() async {
126124
final SimDart sim = SimDart();
127125
128-
sim.resources.limited(id: 'resource', capacity: 1);
126+
sim.resources.limited(name: 'resource', capacity: 1);
129127
130128
sim.process(event: _eventResource, name: 'A');
131129
sim.process(event: _eventResource, name: 'B');

example/example.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import 'package:simdart/simdart.dart';
22

33
void main() async {
4-
final SimDart sim = SimDart(includeTracks: true);
4+
final SimDart sim = SimDart(observer: ConsoleEventObserver());
55

66
sim.process(event: _eventA, name: 'A');
77

88
SimResult result = await sim.run();
99

10-
result.tracks?.forEach((track) => print(track));
1110
print('startTime: ${result.startTime}');
1211
print('duration: ${result.duration}');
1312
}

lib/simdart.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
export 'src/event.dart';
22
export 'src/interval.dart';
33
export 'src/observable.dart';
4+
export 'src/sim_observer.dart';
5+
export 'src/event_phase.dart';
46
export 'src/resources.dart' hide ResourcesFactory, ResourceStore;
57
export 'src/simdart.dart' hide SimDartHelper;
6-
export 'src/simulation_track.dart';
78
export 'src/start_time_handling.dart';
89
export 'src/sim_result.dart';
910
export 'src/sim_num.dart';

lib/src/event_phase.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/// Enum representing the possible event phases.
2+
///
3+
/// This enumeration is used to track and distinguish different event status
4+
/// during the lifecycle of the simulation.
5+
enum EventPhase {
6+
/// The event was called for the first time.
7+
called,
8+
9+
/// The event was resumed after being paused.
10+
resumed,
11+
12+
yielded,
13+
14+
finished;
15+
16+
/// Returns the string representation of the status.
17+
@override
18+
String toString() {
19+
return name;
20+
}
21+
}

lib/src/internal/completer_action.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@ class CompleterAction extends TimeAction {
1212
void execute() {
1313
complete.call();
1414
}
15+
16+
@override
17+
void dispose() {}
1518
}

lib/src/internal/event_action.dart

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:async';
22

33
import 'package:meta/meta.dart';
44
import 'package:simdart/src/event.dart';
5+
import 'package:simdart/src/event_phase.dart';
56
import 'package:simdart/src/internal/completer_action.dart';
67
import 'package:simdart/src/internal/time_action.dart';
78
import 'package:simdart/src/interval.dart';
@@ -10,7 +11,6 @@ import 'package:simdart/src/sim_context.dart';
1011
import 'package:simdart/src/sim_counter.dart';
1112
import 'package:simdart/src/sim_num.dart';
1213
import 'package:simdart/src/simdart.dart';
13-
import 'package:simdart/src/simulation_track.dart';
1414

1515
@internal
1616
class EventAction extends TimeAction implements SimContext {
@@ -52,10 +52,11 @@ class EventAction extends TimeAction implements SimContext {
5252
throw StateError('This event is yielding');
5353
}
5454

55-
if (sim.includeTracks) {
56-
SimDartHelper.addSimulationTrack(
57-
sim: sim, eventName: eventName, status: Status.called);
58-
}
55+
sim.observer?.onEvent(
56+
name: eventName,
57+
time: sim.now,
58+
phase: EventPhase.called,
59+
executionHash: hashCode);
5960

6061
_runEvent().then((_) {
6162
if (_eventCompleter != null) {
@@ -65,7 +66,15 @@ class EventAction extends TimeAction implements SimContext {
6566
"Next event is being scheduled, but the current one is still paused waiting for continuation. Did you forget to use 'await'?");
6667
return;
6768
}
69+
sim.observer?.onEvent(
70+
name: eventName,
71+
time: sim.now,
72+
phase: EventPhase.finished,
73+
executionHash: hashCode);
74+
6875
SimDartHelper.scheduleNextAction(sim: sim);
76+
}).catchError((e) {
77+
// Sim already marked to finish. Let the last event finalize.
6978
});
7079
}
7180

@@ -82,10 +91,12 @@ class EventAction extends TimeAction implements SimContext {
8291
return;
8392
}
8493

85-
if (sim.includeTracks) {
86-
SimDartHelper.addSimulationTrack(
87-
sim: sim, eventName: eventName, status: Status.yielded);
88-
}
94+
sim.observer?.onEvent(
95+
name: eventName,
96+
time: sim.now,
97+
phase: EventPhase.yielded,
98+
executionHash: hashCode);
99+
89100
_eventCompleter = EventCompleter(event: this);
90101

91102
// Schedule a complete to resume this event in the future.
@@ -131,6 +142,11 @@ class EventAction extends TimeAction implements SimContext {
131142
SimNum num(String name) {
132143
return sim.num(name);
133144
}
145+
146+
@override
147+
void dispose() {
148+
_eventCompleter?.complete();
149+
}
134150
}
135151

136152
class EventCompleter {
@@ -143,10 +159,11 @@ class EventCompleter {
143159
Future<void> get future => _completer.future;
144160

145161
void complete() {
146-
if (event.sim.includeTracks) {
147-
SimDartHelper.addSimulationTrack(
148-
sim: event.sim, eventName: event.eventName, status: Status.resumed);
149-
}
162+
event.sim.observer?.onEvent(
163+
name: event.eventName,
164+
time: event.sim.now,
165+
phase: EventPhase.resumed,
166+
executionHash: hashCode);
150167
_completer.complete();
151168
event._eventCompleter = null;
152169
}

lib/src/internal/repeat_event_action.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,7 @@ class RepeatEventAction extends TimeAction {
4545
}
4646
SimDartHelper.scheduleNextAction(sim: sim);
4747
}
48+
49+
@override
50+
void dispose() {}
4851
}

lib/src/internal/time_action.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ abstract class TimeAction {
1414
final int order;
1515

1616
void execute();
17+
18+
void dispose();
1719
}

lib/src/resources.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'dart:collection';
22

33
import 'package:meta/meta.dart';
4+
import 'package:simdart/src/event_phase.dart';
45
import 'package:simdart/src/internal/completer_action.dart';
56
import 'package:simdart/src/internal/event_action.dart';
67
import 'package:simdart/src/simdart.dart';
7-
import 'package:simdart/src/simulation_track.dart';
88

99
@internal
1010
class ResourceStore {
@@ -163,10 +163,11 @@ class ResourcesContext extends Resources {
163163
if (resource != null) {
164164
bool acquired = resource.acquire(_event);
165165
if (!acquired) {
166-
if (_sim.includeTracks) {
167-
SimDartHelper.addSimulationTrack(
168-
sim: _sim, eventName: _event.eventName, status: Status.yielded);
169-
}
166+
_sim.observer?.onEvent(
167+
name: _event.eventName,
168+
time: _sim.now,
169+
phase: EventPhase.yielded,
170+
executionHash: _event.hashCode);
170171
_event.buildCompleter();
171172
resource._waiting.add(_event);
172173
SimDartHelper.scheduleNextAction(sim: _sim);

0 commit comments

Comments
 (0)