fj_core/operations/update/
sketch.rs

1use crate::{
2    objects::{Region, Sketch},
3    operations::{derive::DeriveFrom, insert::Insert},
4    storage::Handle,
5    Core,
6};
7
8/// Update a [`Sketch`]
9pub trait UpdateSketch {
10    /// Add a region to the sketch
11    #[must_use]
12    fn add_regions<T>(
13        &self,
14        regions: impl IntoIterator<Item = T>,
15        core: &mut Core,
16    ) -> Self
17    where
18        T: Insert<Inserted = Handle<Region>>;
19
20    /// Update a region of the sketch
21    ///
22    /// # Panics
23    ///
24    /// Panics, if the object can't be found.
25    ///
26    /// Panics, if the update results in multiple handles referencing the same object.
27    #[must_use]
28    fn update_region<T, R>(
29        &self,
30        handle: &Handle<Region>,
31        update: impl FnOnce(&Handle<Region>, &mut Core) -> R,
32        core: &mut Core,
33    ) -> Self
34    where
35        T: Insert<Inserted = Handle<Region>>,
36        R: IntoIterator<Item = T>;
37}
38
39impl UpdateSketch for Sketch {
40    fn add_regions<T>(
41        &self,
42        regions: impl IntoIterator<Item = T>,
43        core: &mut Core,
44    ) -> Self
45    where
46        T: Insert<Inserted = Handle<Region>>,
47    {
48        let regions = regions.into_iter().map(|region| region.insert(core));
49        let regions = self.regions().iter().cloned().chain(regions);
50        Sketch::new(regions)
51    }
52
53    fn update_region<T, R>(
54        &self,
55        handle: &Handle<Region>,
56        update: impl FnOnce(&Handle<Region>, &mut Core) -> R,
57        core: &mut Core,
58    ) -> Self
59    where
60        T: Insert<Inserted = Handle<Region>>,
61        R: IntoIterator<Item = T>,
62    {
63        let regions = self
64            .regions()
65            .replace(
66                handle,
67                update(handle, core).into_iter().map(|object| {
68                    object.insert(core).derive_from(handle, core)
69                }),
70            )
71            .expect("Region not found");
72        Sketch::new(regions)
73    }
74}