diff options
author | Melody Horn <melody@boringcactus.com> | 2021-03-07 09:12:47 -0700 |
---|---|---|
committer | Melody Horn <melody@boringcactus.com> | 2021-03-07 09:12:47 -0700 |
commit | 36d5ff553a1d65d70da5251b8865d62294c929f6 (patch) | |
tree | 065618d7f6c0a407b844842c310919010384beca /src/world.rs | |
parent | 28a8fb462fa88da300c6cf016ed3c70c402b8dba (diff) | |
download | hope-36d5ff553a1d65d70da5251b8865d62294c929f6.tar.gz hope-36d5ff553a1d65d70da5251b8865d62294c929f6.zip |
tear it all up and implement super basic actors
Diffstat (limited to 'src/world.rs')
-rw-r--r-- | src/world.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/world.rs b/src/world.rs new file mode 100644 index 0000000..53217e2 --- /dev/null +++ b/src/world.rs @@ -0,0 +1,47 @@ +use std::collections::HashMap; +use std::sync::mpsc::{self, Receiver, Sender}; +use std::thread; + +use uuid::Uuid; + +use crate::actor::{Actorful, Value, Slot}; + +pub struct ActorThreadId(Uuid); + +#[derive(Default)] +pub struct World { + actor_types: HashMap<String, Box<dyn Actorful + Send>>, + actors: HashMap<ActorThreadId, String>, +} + +impl World { + pub fn upsert_actor_type(&mut self, name: String, actor: Box<dyn Actorful + Send>) { + self.actor_types.insert(name, actor); + } + + pub fn spawn_actor(&mut self, r#type: &str) -> (Uuid, HashMap<String, Sender<Value>>, HashMap<String, Receiver<Value>>) { + fn make_channels(slot: Slot) -> ((String, Sender<Value>), (String, Receiver<Value>)) { + let (sender, receiver) = mpsc::channel::<Value>(); + ((slot.name.clone(), sender), (slot.name, receiver)) + } + + let actor = self.actor_types.get(r#type).unwrap(); + let actor = actor.boxed_clone(); + let input_slots = actor.inputs(); + let (input_senders, input_receivers) = input_slots + .into_iter() + .map(make_channels) + .unzip(); + let output_slots = actor.outputs(); + let (output_senders, output_receivers) = output_slots + .into_iter() + .map(make_channels) + .unzip(); + let id = Uuid::new_v4(); + thread::Builder::new() + .name(id.to_string()) + .spawn(move || actor.launch(input_receivers, output_senders, self)) + .unwrap(); + (id, input_senders, output_receivers) + } +} |