Skip to content

Commit 194c726

Browse files
authored
14 version 030 (#17)
* Simplifying code. #14 * Allow access to the list of created resources. * Added: `runState` to check if the simulation has not started, is running, or has completed. #14 * `stop` method to manually stop the simulation before it completes. #14 * Observer to receive data throughout the simulation. #14 * Removing unimplemented method. #14 * Version 0.3.0
1 parent c8c0b9a commit 194c726

27 files changed

+557
-488
lines changed

CHANGELOG.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
## 0.3.0
2+
3+
* Access the list of created resources.
4+
* Added
5+
* `runState` getter to determine whether the simulation has not started, is running, or has completed.
6+
* `stop` method to manually stop the simulation before it completes.
7+
* Observer to receive data throughout the simulation.
8+
19
## 0.2.0
210

311
* Setting to determine how often `Future.delayed` is used instead of `Future.microtask` during event execution to allow GUI refresh.
@@ -8,8 +16,8 @@
816
## 0.1.0
917

1018
* Initial release
11-
* Discrete event processing
12-
* Event scheduling, execution, waiting, and repetition
13-
* Intervals management
19+
* Discrete event processing.
20+
* Event scheduling, execution, waiting, and repetition.
21+
* Intervals management.
1422
* Resources
1523
* Capacity limit

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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
export 'src/event.dart';
22
export 'src/interval.dart';
33
export 'src/observable.dart';
4-
export 'src/resources_context.dart';
5-
export 'src/resources.dart';
4+
export 'src/sim_observer.dart';
5+
export 'src/event_phase.dart';
6+
export 'src/resources.dart' hide ResourcesFactory, ResourceStore;
67
export 'src/simdart.dart' hide SimDartHelper;
7-
export 'src/simulation_track.dart';
88
export 'src/start_time_handling.dart';
99
export 'src/sim_result.dart';
1010
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: 37 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,15 @@ 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';
6-
import 'package:simdart/src/internal/resource.dart';
7-
import 'package:simdart/src/internal/resources_context_impl.dart';
87
import 'package:simdart/src/internal/time_action.dart';
98
import 'package:simdart/src/interval.dart';
10-
import 'package:simdart/src/resources_context.dart';
9+
import 'package:simdart/src/resources.dart';
1110
import 'package:simdart/src/sim_context.dart';
1211
import 'package:simdart/src/sim_counter.dart';
1312
import 'package:simdart/src/sim_num.dart';
1413
import 'package:simdart/src/simdart.dart';
15-
import 'package:simdart/src/simulation_track.dart';
1614

1715
@internal
1816
class EventAction extends TimeAction implements SimContext {
@@ -35,24 +33,30 @@ class EventAction extends TimeAction implements SimContext {
3533
final SimDart sim;
3634

3735
@override
38-
late final ResourcesContext resources = ResourcesContextImpl(sim, this);
36+
late final ResourcesContext resources = ResourcesFactory.context(sim, this);
3937

4038
@override
4139
int get now => sim.now;
4240

4341
/// Internal handler for resuming a waiting event.
4442
EventCompleter? _eventCompleter;
43+
EventCompleter? get eventCompleter => _eventCompleter;
44+
45+
void buildCompleter() {
46+
_eventCompleter = EventCompleter(event: this);
47+
}
4548

4649
@override
4750
void execute() {
4851
if (_eventCompleter != null) {
4952
throw StateError('This event is yielding');
5053
}
5154

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

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

@@ -79,10 +91,12 @@ class EventAction extends TimeAction implements SimContext {
7991
return;
8092
}
8193

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

88102
// Schedule a complete to resume this event in the future.
@@ -95,53 +109,6 @@ class EventAction extends TimeAction implements SimContext {
95109
SimDartHelper.scheduleNextAction(sim: sim);
96110

97111
await _eventCompleter!.future;
98-
_eventCompleter = null;
99-
}
100-
101-
Future<void> acquireResource(String id) async {
102-
if (_eventCompleter != null) {
103-
SimDartHelper.error(
104-
sim: sim,
105-
msg:
106-
"This event should be waiting for the resource to be released. Did you forget to use 'await'?");
107-
return;
108-
}
109-
Resource? resource = SimDartHelper.getResource(sim: sim, resourceId: id);
110-
if (resource != null) {
111-
bool acquired = resource.acquire(this);
112-
if (!acquired) {
113-
if (sim.includeTracks) {
114-
SimDartHelper.addSimulationTrack(
115-
sim: sim, eventName: eventName, status: Status.yielded);
116-
}
117-
_eventCompleter = EventCompleter(event: this);
118-
resource.waiting.add(this);
119-
SimDartHelper.scheduleNextAction(sim: sim);
120-
await _eventCompleter!.future;
121-
_eventCompleter = null;
122-
return await acquireResource(id);
123-
}
124-
}
125-
}
126-
127-
void releaseResource(String id) {
128-
Resource? resource = SimDartHelper.getResource(sim: sim, resourceId: id);
129-
if (resource != null) {
130-
if (resource.release(sim, this)) {
131-
if (resource.waiting.isNotEmpty) {
132-
//resource.waiting.removeAt(0).call();
133-
EventAction other = resource.waiting.removeAt(0);
134-
// Schedule a complete to resume this event in the future.
135-
SimDartHelper.addAction(
136-
sim: sim,
137-
action: CompleterAction(
138-
start: sim.now,
139-
complete: other._eventCompleter!.complete,
140-
order: other.order));
141-
SimDartHelper.scheduleNextAction(sim: sim);
142-
}
143-
}
144-
}
145112
}
146113

147114
@override
@@ -175,6 +142,11 @@ class EventAction extends TimeAction implements SimContext {
175142
SimNum num(String name) {
176143
return sim.num(name);
177144
}
145+
146+
@override
147+
void dispose() {
148+
_eventCompleter?.complete();
149+
}
178150
}
179151

180152
class EventCompleter {
@@ -187,10 +159,11 @@ class EventCompleter {
187159
Future<void> get future => _completer.future;
188160

189161
void complete() {
190-
if (event.sim.includeTracks) {
191-
SimDartHelper.addSimulationTrack(
192-
sim: event.sim, eventName: event.eventName, status: Status.resumed);
193-
}
162+
event.sim.observer?.onEvent(
163+
name: event.eventName,
164+
time: event.sim.now,
165+
phase: EventPhase.resumed,
166+
executionHash: hashCode);
194167
_completer.complete();
195168
event._eventCompleter = null;
196169
}

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/resource.dart

Lines changed: 0 additions & 50 deletions
This file was deleted.

lib/src/internal/resources_context_impl.dart

Lines changed: 0 additions & 34 deletions
This file was deleted.

0 commit comments

Comments
 (0)