diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-02-09 14:11:00 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-02-09 14:11:00 +0100 |
| commit | 924a27bc37f29769da225184ec1b35f9b96dbab5 (patch) | |
| tree | 61f1ca78602e6aed09b48789960ca741734a9ca2 /library | |
| parent | 669f9707c333341f12ffa754496e832c76388a51 (diff) | |
Move `Fragment` into library
Diffstat (limited to 'library')
| -rw-r--r-- | library/src/layout/fragment.rs | 82 | ||||
| -rw-r--r-- | library/src/layout/mod.rs | 2 | ||||
| -rw-r--r-- | library/src/prelude.rs | 2 |
3 files changed, 85 insertions, 1 deletions
diff --git a/library/src/layout/fragment.rs b/library/src/layout/fragment.rs new file mode 100644 index 00000000..d1f6b524 --- /dev/null +++ b/library/src/layout/fragment.rs @@ -0,0 +1,82 @@ +use crate::prelude::*; + +/// A partial layout result. +#[derive(Clone)] +pub struct Fragment(Vec<Frame>); + +impl Fragment { + /// Create a fragment from a single frame. + pub fn frame(frame: Frame) -> Self { + Self(vec![frame]) + } + + /// Create a fragment from multiple frames. + pub fn frames(frames: Vec<Frame>) -> Self { + Self(frames) + } + + /// The number of frames in the fragment. + pub fn len(&self) -> usize { + self.0.len() + } + + /// Extract the first and only frame. + /// + /// Panics if there are multiple frames. + #[track_caller] + pub fn into_frame(self) -> Frame { + assert_eq!(self.0.len(), 1, "expected exactly one frame"); + self.0.into_iter().next().unwrap() + } + + /// Extract the frames. + pub fn into_frames(self) -> Vec<Frame> { + self.0 + } + + /// Iterate over the contained frames. + pub fn iter(&self) -> std::slice::Iter<Frame> { + self.0.iter() + } + + /// Iterate over the contained frames. + pub fn iter_mut(&mut self) -> std::slice::IterMut<Frame> { + self.0.iter_mut() + } +} + +impl Debug for Fragment { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + match self.0.as_slice() { + [frame] => frame.fmt(f), + frames => frames.fmt(f), + } + } +} + +impl IntoIterator for Fragment { + type Item = Frame; + type IntoIter = std::vec::IntoIter<Frame>; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl<'a> IntoIterator for &'a Fragment { + type Item = &'a Frame; + type IntoIter = std::slice::Iter<'a, Frame>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + +impl<'a> IntoIterator for &'a mut Fragment { + type Item = &'a mut Frame; + type IntoIter = std::slice::IterMut<'a, Frame>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter_mut() + } +} diff --git a/library/src/layout/mod.rs b/library/src/layout/mod.rs index ab5ebaf8..61fcfd44 100644 --- a/library/src/layout/mod.rs +++ b/library/src/layout/mod.rs @@ -6,6 +6,7 @@ mod container; #[path = "enum.rs"] mod enum_; mod flow; +mod fragment; mod grid; mod hide; mod list; @@ -25,6 +26,7 @@ pub use self::columns::*; pub use self::container::*; pub use self::enum_::*; pub use self::flow::*; +pub use self::fragment::*; pub use self::grid::*; pub use self::hide::*; pub use self::list::*; diff --git a/library/src/prelude.rs b/library/src/prelude.rs index b8f6025a..98ec1ccb 100644 --- a/library/src/prelude.rs +++ b/library/src/prelude.rs @@ -28,6 +28,6 @@ pub use typst::util::{format_eco, EcoString}; pub use typst::World; #[doc(no_inline)] -pub use crate::layout::{Inline, Layout, Regions}; +pub use crate::layout::{Fragment, Inline, Layout, Regions}; #[doc(no_inline)] pub use crate::shared::{Behave, Behaviour, ContentExt, StyleMapExt}; |
