use std::rc::Rc;
use sim_kernel::{Expr, Result};
use crate::DeviceProfile;
#[derive(Clone, Debug, PartialEq)]
pub struct EncodedScene {
scene: Rc<Expr>,
}
impl EncodedScene {
pub fn new(scene: Expr) -> Self {
Self {
scene: Rc::new(scene),
}
}
pub fn from_shared(scene: Rc<Expr>) -> Self {
Self { scene }
}
pub fn expr(&self) -> &Expr {
&self.scene
}
pub fn shared(&self) -> Rc<Expr> {
Rc::clone(&self.scene)
}
}
pub trait LocalAdapter {
type State;
fn adapt(
&self,
scene: &EncodedScene,
state: &Self::State,
profile: &DeviceProfile,
) -> Result<Rc<Expr>>;
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct MirrorAdapter;
impl LocalAdapter for MirrorAdapter {
type State = ();
fn adapt(
&self,
scene: &EncodedScene,
_state: &Self::State,
_profile: &DeviceProfile,
) -> Result<Rc<Expr>> {
Ok(scene.shared())
}
}