1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//! Resources: singletons stored in the world (DECISIONS #20).
use fmt;
use ;
use graph;
/// A singleton stored in the [`World`](crate::World), one value per type.
///
/// Implemented for every `Send + Sync + 'static` type, like [`Component`](crate::Component). A
/// type may be a component and a resource at once; the two are separate data.
///
/// ```
/// use pragma_ecs::{Resource, World};
///
/// struct Gravity(f32);
///
/// fn assert_resource<T: Resource>() {}
/// assert_resource::<Gravity>();
///
/// let mut world = World::new();
/// world.insert_resource(Gravity(9.8));
/// assert_eq!(world.resource::<Gravity>().map(|g| g.0), Some(9.8));
/// ```
/// A resource borrowed for reading: [`World::resource`](crate::World::resource), or a system
/// parameter that reads resource `T`.
///
/// ```
/// use pragma_core::prelude::{PoolConfig, ThreadPool};
/// use pragma_ecs::{Res, ResMut, Schedule, World};
///
/// struct Gravity(f32);
/// struct Speed(f32);
///
/// fn fall(gravity: Res<Gravity>, mut speed: ResMut<Speed>) {
/// speed.0 += gravity.0;
/// }
///
/// let mut world = World::new();
/// world.insert_resource(Gravity(2.0));
/// world.insert_resource(Speed(0.0));
/// let mut builder = Schedule::builder();
/// builder.add_system("fall", fall)?;
/// let mut schedule = builder.build()?;
/// let pool = ThreadPool::new(PoolConfig::default().with_workers(1))?;
/// schedule.run(&mut world, &pool)?;
/// schedule.run(&mut world, &pool)?;
/// assert_eq!(world.resource::<Speed>().map(|s| s.0), Some(4.0));
/// # Ok::<(), Box<dyn std::error::Error>>(())
/// ```
Res);
/// A resource borrowed for writing: a system parameter that writes resource `T`. See the
/// [`Res`] example.
///
/// ```
/// use pragma_ecs::{ResMut, Schedule};
///
/// struct Frame(u64);
///
/// fn count(mut frame: ResMut<Frame>) {
/// frame.0 += 1;
/// }
///
/// let mut builder = Schedule::builder();
/// builder.add_system("count", count)?;
/// # Ok::<(), pragma_ecs::EcsError>(())
/// ```
ResMut);