Skip to content

Commit 1382e3b

Browse files
committed
Simplifying code. #14
1 parent c8c0b9a commit 1382e3b

File tree

8 files changed

+114
-143
lines changed

8 files changed

+114
-143
lines changed

lib/simdart.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
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/resources.dart' hide ResourcesFactory;
65
export 'src/simdart.dart' hide SimDartHelper;
76
export 'src/simulation_track.dart';
87
export 'src/start_time_handling.dart';

lib/src/internal/event_action.dart

Lines changed: 7 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@ import 'dart:async';
33
import 'package:meta/meta.dart';
44
import 'package:simdart/src/event.dart';
55
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';
86
import 'package:simdart/src/internal/time_action.dart';
97
import 'package:simdart/src/interval.dart';
10-
import 'package:simdart/src/resources_context.dart';
8+
import 'package:simdart/src/resources.dart';
119
import 'package:simdart/src/sim_context.dart';
1210
import 'package:simdart/src/sim_counter.dart';
1311
import 'package:simdart/src/sim_num.dart';
@@ -35,13 +33,18 @@ 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() {
@@ -95,53 +98,6 @@ class EventAction extends TimeAction implements SimContext {
9598
SimDartHelper.scheduleNextAction(sim: sim);
9699

97100
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-
}
145101
}
146102

147103
@override

lib/src/internal/resources_context_impl.dart

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

lib/src/internal/resources_impl.dart

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

lib/src/resources.dart

Lines changed: 104 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
1-
abstract class Resources {
1+
import 'package:meta/meta.dart';
2+
import 'package:simdart/src/internal/completer_action.dart';
3+
import 'package:simdart/src/internal/event_action.dart';
4+
import 'package:simdart/src/internal/resource.dart';
5+
import 'package:simdart/src/simdart.dart';
6+
import 'package:simdart/src/simulation_track.dart';
7+
8+
class Resources {
9+
Resources._(SimDart sim) : _sim = sim;
10+
11+
final SimDart _sim;
12+
213
/// Creates a resource with limited capacity.
314
///
415
/// This method adds a resource with the specified capacity.
@@ -7,11 +18,101 @@ abstract class Resources {
718
///
819
/// - [id]: The unique identifier of the resource (required).
920
/// - [capacity]: The maximum capacity of the resource. The default value is 1.
10-
void limited({required String id, int capacity = 1});
21+
void limited({required String id, int capacity = 1}) {
22+
SimDartHelper.addResource(
23+
sim: _sim,
24+
resourceId: id,
25+
create: () => LimitedResource(id: id, capacity: capacity));
26+
}
1127

1228
/// Checks if a resource is available.
1329
///
1430
/// - [id]: The id of the resource to check.
1531
/// - Returns: `true` if the resource is available, `false` otherwise.
16-
bool isAvailable(String id);
32+
bool isAvailable(String id) {
33+
Resource? resource = SimDartHelper.getResource(sim: _sim, resourceId: id);
34+
if (resource != null) {
35+
return resource.isAvailable();
36+
}
37+
return false;
38+
}
39+
}
40+
41+
class ResourcesContext extends Resources {
42+
ResourcesContext._(super.sim, EventAction event)
43+
: _event = event,
44+
super._();
45+
46+
final EventAction _event;
47+
48+
/// Tries to acquire a resource immediately.
49+
///
50+
/// - [id]: The id of the resource to acquire.
51+
/// - Returns: `true` if the resource was acquired, `false` otherwise.
52+
bool tryAcquire(String id) {
53+
Resource? resource = SimDartHelper.getResource(sim: _sim, resourceId: id);
54+
if (resource != null) {
55+
return resource.acquire(_event);
56+
}
57+
return false;
58+
}
59+
60+
/// Acquires a resource, waiting if necessary until it becomes available.
61+
///
62+
/// - [id]: The id of the resource to acquire.
63+
/// - Returns: A [Future] that completes when the resource is acquired.
64+
Future<void> acquire(String id) async {
65+
if (_event.eventCompleter != null) {
66+
SimDartHelper.error(
67+
sim: _sim,
68+
msg:
69+
"This event should be waiting for the resource to be released. Did you forget to use 'await'?");
70+
return;
71+
}
72+
Resource? resource = SimDartHelper.getResource(sim: _sim, resourceId: id);
73+
if (resource != null) {
74+
bool acquired = resource.acquire(_event);
75+
if (!acquired) {
76+
if (_sim.includeTracks) {
77+
SimDartHelper.addSimulationTrack(
78+
sim: _sim, eventName: _event.eventName, status: Status.yielded);
79+
}
80+
_event.buildCompleter();
81+
resource.waiting.add(_event);
82+
SimDartHelper.scheduleNextAction(sim: _sim);
83+
await _event.eventCompleter!.future;
84+
return await acquire(id);
85+
}
86+
}
87+
}
88+
89+
/// Releases a previously acquired resource.
90+
///
91+
/// - [id]: The id of the resource to release.
92+
void release(String id) {
93+
Resource? resource = SimDartHelper.getResource(sim: _sim, resourceId: id);
94+
if (resource != null) {
95+
if (resource.release(_sim, _event)) {
96+
if (resource.waiting.isNotEmpty) {
97+
EventAction other = resource.waiting.removeAt(0);
98+
// Schedule a complete to resume this event in the future.
99+
SimDartHelper.addAction(
100+
sim: _sim,
101+
action: CompleterAction(
102+
start: _sim.now,
103+
complete: other.eventCompleter!.complete,
104+
order: other.order));
105+
SimDartHelper.scheduleNextAction(sim: _sim);
106+
}
107+
}
108+
}
109+
}
110+
}
111+
112+
@internal
113+
class ResourcesFactory {
114+
static Resources sim(SimDart sim) => Resources._(sim);
115+
116+
static ResourcesContext context(SimDart sim, EventAction event) =>
117+
ResourcesContext._(sim, event);
17118
}

lib/src/resources_context.dart

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

lib/src/sim_context.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'package:simdart/src/internal/simdart_interface.dart';
2-
import 'package:simdart/src/resources_context.dart';
2+
import 'package:simdart/src/resources.dart';
33

44
abstract interface class SimContext implements SimDartInterface {
55
/// Pauses the execution of the event for the specified [delay] in simulation time.

lib/src/simdart.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:simdart/src/event.dart';
77
import 'package:simdart/src/internal/event_action.dart';
88
import 'package:simdart/src/internal/repeat_event_action.dart';
99
import 'package:simdart/src/internal/resource.dart';
10-
import 'package:simdart/src/internal/resources_impl.dart';
1110
import 'package:simdart/src/internal/simdart_interface.dart';
1211
import 'package:simdart/src/internal/time_action.dart';
1312
import 'package:simdart/src/interval.dart';
@@ -55,7 +54,7 @@ class SimDart implements SimDartInterface {
5554
/// Holds the resources in the simulator.
5655
final Map<String, Resource> _resources = {};
5756

58-
late final Resources resources = ResourcesImpl(this);
57+
late final Resources resources = ResourcesFactory.sim(this);
5958

6059
/// The instance of the random number generator used across the simulation.
6160
/// It is initialized once and reused to improve performance, avoiding the need to

0 commit comments

Comments
 (0)