use crate::{
objects::{Region, Sketch},
storage::Handle,
};
pub trait UpdateSketch {
#[must_use]
fn add_region(&self, region: Handle<Region>) -> Self;
#[must_use]
fn update_region(
&self,
handle: &Handle<Region>,
update: impl FnOnce(&Handle<Region>) -> Handle<Region>,
) -> Self;
#[must_use]
fn replace_region<const N: usize>(
&self,
handle: &Handle<Region>,
replace: impl FnOnce(&Handle<Region>) -> [Handle<Region>; N],
) -> Self;
}
impl UpdateSketch for Sketch {
fn add_region(&self, region: Handle<Region>) -> Self {
Sketch::new(self.regions().iter().cloned().chain([region]))
}
fn update_region(
&self,
handle: &Handle<Region>,
update: impl FnOnce(&Handle<Region>) -> Handle<Region>,
) -> Self {
let regions = self
.regions()
.replace(handle, [update(handle)])
.expect("Region not found");
Sketch::new(regions)
}
fn replace_region<const N: usize>(
&self,
handle: &Handle<Region>,
replace: impl FnOnce(&Handle<Region>) -> [Handle<Region>; N],
) -> Self {
let regions = self
.regions()
.replace(handle, replace(handle))
.expect("Region not found");
Sketch::new(regions)
}
}