use std::sync::Arc;
use crate::slot_management::swap;
pub trait Item {
type Id: Eq;
fn stackable(&self) -> bool;
fn max_quant(&self) -> u16;
fn id(&self) -> Self::Id;
}
pub trait ItemInstance<I: Item> {
fn quant(&self) -> u16;
fn item(&self) -> Arc<I>;
fn new(item: Arc<I>, quantity: u16) -> Self;
}
pub trait Slot<I: Item, II: ItemInstance<I>> {
fn item_instance(&self) -> Option<II>;
fn set_item_instance(&mut self, item_instance: &Option<II>);
fn transfer(&mut self, item_instance: Option<II>, _button: &str) -> Option<II> {
let res = swap((self.item_instance(), item_instance));
self.set_modified(true);
self.set_item_instance(&res.0);
res.1
}
fn modified(&mut self) -> bool;
fn set_modified(&mut self, modified: bool);
fn new(item_instance: Option<II>) -> Self;
}