Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. use std::collections::HashMap;
  2. use std::collections::VecDeque;
  3. use std::any::Any;
  4.  
  5. trait Entity {
  6.  
  7. fn process(&self, effect: &Effect);
  8.  
  9. }
  10.  
  11. struct MyEntity;
  12.  
  13. impl Entity for MyEntity {
  14.  
  15. fn process(&self, effect: &Effect) {
  16.  
  17. match effect.as_any().downcast_ref::<MyEffect<&str>>() {
  18.  
  19. Some(x) => println!("It's a string: {}", x.data),
  20. None => match effect.as_any().downcast_ref::<MyEffect<u32>>() {
  21.  
  22. Some(y) => println!("It's a u32: {}", y.data),
  23. None => unreachable!(),
  24.  
  25. }
  26.  
  27. }
  28.  
  29. }
  30.  
  31. }
  32.  
  33. struct Environment<'a> {
  34. name: &'a str,
  35. entities: Vec<&'a Entity>,
  36. }
  37.  
  38. impl<'a> Environment<'a> {
  39.  
  40. fn join(&mut self, entity: &'a Entity) {
  41. self.entities.push(entity);
  42. }
  43.  
  44. fn leave(&mut self, entity: &'a Entity) {
  45. //let index = self.entities.iter().position(|x| *x == entity).unwrap();
  46. //self.entities.remove(index);
  47. }
  48.  
  49. fn send(&mut self, effect: &'a Effect) {
  50. for entity in &self.entities {
  51. entity.process(effect);
  52. }
  53. }
  54.  
  55. }
  56.  
  57. trait Effect {
  58.  
  59. fn as_any(&self) -> &dyn Any;
  60.  
  61. }
  62.  
  63. struct MyEffect<T> {
  64. data: T,
  65. }
  66.  
  67. impl<T:'static> Effect for MyEffect<T> {
  68.  
  69. fn as_any(&self) -> &dyn Any {
  70. self
  71. }
  72.  
  73. }
  74.  
  75. struct Event<'a> {
  76. environment: &'a str,
  77. effect: Effect,
  78. }
  79.  
  80. struct Supervisor<'a> {
  81. environments: HashMap<&'a str, Environment<'a>>,
  82. queue: VecDeque<&'a Event<'a>>,
  83. }
  84.  
  85. impl<'a> Supervisor<'a> {
  86.  
  87. fn new() -> Supervisor<'a> {
  88. Supervisor{ environments: HashMap::new(), queue: VecDeque::new() }
  89. }
  90.  
  91. fn create_environment(&mut self, name: &'a str) {
  92. if !self.environments.contains_key(name) {
  93. let env = Environment{name: name, entities: Vec::new()};
  94. self.environments.insert(name, env);
  95. }
  96. }
  97.  
  98. fn join_environment(&mut self, name: &'a str, entity:&'a Entity) {
  99. self.create_environment(name);
  100. let env:&mut Environment = self.environments.get_mut(name).unwrap();
  101. env.join(entity);
  102. }
  103.  
  104. fn leave_environment(&mut self, name: &'a str, entity:&'a Entity) {
  105. if self.environments.contains_key(name) {
  106. let env:&mut Environment = self.environments.get_mut(name).unwrap();
  107. env.leave(entity);
  108. }
  109. }
  110.  
  111. fn send(&mut self, name: &'a str, effect: &'a Effect) {
  112. self.create_environment(name);
  113. let env:&mut Environment = self.environments.get_mut(name).unwrap();
  114. env.send(effect);
  115. }
  116.  
  117. fn post(&mut self, event: &'a Event) {
  118. self.queue.push_back(event);
  119. }
  120.  
  121. }
  122.  
  123.  
  124. fn main() {
  125.  
  126. let mut supervisor = Supervisor::new();
  127.  
  128. let env = "Test";
  129. supervisor.join_environment(&env, &MyEntity { });
  130.  
  131. let effect = MyEffect{data: "Hello World"};
  132.  
  133. supervisor.send(&env, &effect);
  134.  
  135. let x:u32 = 999;
  136.  
  137. let another_effect = MyEffect{data: x};
  138.  
  139. supervisor.send(&env, &another_effect);
  140.  
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement