From 26bdc1f0f6fe8113d7fcfb4d5aca46aa5238ccd8 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sun, 5 Dec 2021 12:54:03 +0100 Subject: Set Rules Episode I: The Phantom Style --- src/library/stack.rs | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) (limited to 'src/library/stack.rs') diff --git a/src/library/stack.rs b/src/library/stack.rs index 2b1371ab..606632af 100644 --- a/src/library/stack.rs +++ b/src/library/stack.rs @@ -7,7 +7,7 @@ use super::{AlignNode, Spacing}; pub fn stack(_: &mut EvalContext, args: &mut Args) -> TypResult { enum Child { Spacing(Spacing), - Any(Template), + Any(Node), } castable! { @@ -17,38 +17,34 @@ pub fn stack(_: &mut EvalContext, args: &mut Args) -> TypResult { Value::Relative(v) => Self::Spacing(Spacing::Linear(v.into())), Value::Linear(v) => Self::Spacing(Spacing::Linear(v)), Value::Fractional(v) => Self::Spacing(Spacing::Fractional(v)), - Value::Template(v) => Self::Any(v), + Value::Node(v) => Self::Any(v), } let dir = args.named("dir")?.unwrap_or(Dir::TTB); let spacing = args.named("spacing")?; - let list: Vec = args.all().collect(); - - Ok(Value::Template(Template::from_block(move |style| { - let mut children = vec![]; - let mut delayed = None; - - // Build the list of stack children. - for child in &list { - match child { - Child::Spacing(v) => { - children.push(StackChild::Spacing(*v)); - delayed = None; - } - Child::Any(child) => { - if let Some(v) = delayed { - children.push(StackChild::Spacing(v)); - } - let node = child.pack(style); - children.push(StackChild::Node(node)); - delayed = spacing; + let mut children = vec![]; + let mut delayed = None; + + // Build the list of stack children. + for child in args.all() { + match child { + Child::Spacing(v) => { + children.push(StackChild::Spacing(v)); + delayed = None; + } + Child::Any(child) => { + if let Some(v) = delayed { + children.push(StackChild::Spacing(v)); } + + children.push(StackChild::Node(child.into_block())); + delayed = spacing; } } + } - StackNode { dir, children } - }))) + Ok(Value::block(StackNode { dir, children })) } /// A node that stacks its children. -- cgit v1.2.3 From ae38be9097bbb32142ef776e77e627ac12379000 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 15 Dec 2021 11:11:57 +0100 Subject: Set Rules Episode IV: A New Fold --- src/library/stack.rs | 68 +++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 35 deletions(-) (limited to 'src/library/stack.rs') diff --git a/src/library/stack.rs b/src/library/stack.rs index 606632af..285ab9d5 100644 --- a/src/library/stack.rs +++ b/src/library/stack.rs @@ -1,25 +1,10 @@ use std::fmt::{self, Debug, Formatter}; use super::prelude::*; -use super::{AlignNode, Spacing}; +use super::{AlignNode, SpacingKind, SpacingNode}; /// `stack`: Stack children along an axis. pub fn stack(_: &mut EvalContext, args: &mut Args) -> TypResult { - enum Child { - Spacing(Spacing), - Any(Node), - } - - castable! { - Child, - Expected: "linear, fractional or template", - Value::Length(v) => Self::Spacing(Spacing::Linear(v.into())), - Value::Relative(v) => Self::Spacing(Spacing::Linear(v.into())), - Value::Linear(v) => Self::Spacing(Spacing::Linear(v)), - Value::Fractional(v) => Self::Spacing(Spacing::Fractional(v)), - Value::Node(v) => Self::Any(v), - } - let dir = args.named("dir")?.unwrap_or(Dir::TTB); let spacing = args.named("spacing")?; @@ -29,19 +14,15 @@ pub fn stack(_: &mut EvalContext, args: &mut Args) -> TypResult { // Build the list of stack children. for child in args.all() { match child { - Child::Spacing(v) => { - children.push(StackChild::Spacing(v)); - delayed = None; - } - Child::Any(child) => { + StackChild::Spacing(_) => delayed = None, + StackChild::Node(_) => { if let Some(v) = delayed { - children.push(StackChild::Spacing(v)); + children.push(StackChild::spacing(v)); } - - children.push(StackChild::Node(child.into_block())); delayed = spacing; } } + children.push(child); } Ok(Value::block(StackNode { dir, children })) @@ -70,20 +51,37 @@ impl Layout for StackNode { #[derive(Hash)] pub enum StackChild { /// Spacing between other nodes. - Spacing(Spacing), + Spacing(SpacingNode), /// An arbitrary node. Node(PackedNode), } +impl StackChild { + /// Create a spacing node from a spacing kind. + pub fn spacing(kind: SpacingKind) -> Self { + Self::Spacing(SpacingNode { kind, styles: Styles::new() }) + } +} + impl Debug for StackChild { fn fmt(&self, f: &mut Formatter) -> fmt::Result { match self { - Self::Spacing(spacing) => spacing.fmt(f), + Self::Spacing(node) => node.fmt(f), Self::Node(node) => node.fmt(f), } } } +castable! { + StackChild, + Expected: "linear, fractional or template", + Value::Length(v) => Self::spacing(SpacingKind::Linear(v.into())), + Value::Relative(v) => Self::spacing(SpacingKind::Linear(v.into())), + Value::Linear(v) => Self::spacing(SpacingKind::Linear(v)), + Value::Fractional(v) => Self::spacing(SpacingKind::Fractional(v)), + Value::Node(v) => Self::Node(v.into_block()), +} + /// Performs stack layout. struct StackLayouter<'a> { /// The stack node to layout. @@ -144,15 +142,15 @@ impl<'a> StackLayouter<'a> { /// Layout all children. fn layout(mut self, ctx: &mut LayoutContext) -> Vec>> { for child in &self.stack.children { - match *child { - StackChild::Spacing(Spacing::Linear(v)) => { - self.layout_absolute(v); - } - StackChild::Spacing(Spacing::Fractional(v)) => { - self.items.push(StackItem::Fractional(v)); - self.fr += v; - } - StackChild::Node(ref node) => { + match child { + StackChild::Spacing(node) => match node.kind { + SpacingKind::Linear(v) => self.layout_absolute(v), + SpacingKind::Fractional(v) => { + self.items.push(StackItem::Fractional(v)); + self.fr += v; + } + }, + StackChild::Node(node) => { if self.regions.is_full() { self.finish_region(); } -- cgit v1.2.3 From 438255519e88bb790480306b9a9b452aaf054519 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 22 Dec 2021 19:04:35 +0100 Subject: Review One: A Set Rules Story --- src/library/stack.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/library/stack.rs') diff --git a/src/library/stack.rs b/src/library/stack.rs index 285ab9d5..8a1f0fd5 100644 --- a/src/library/stack.rs +++ b/src/library/stack.rs @@ -9,17 +9,17 @@ pub fn stack(_: &mut EvalContext, args: &mut Args) -> TypResult { let spacing = args.named("spacing")?; let mut children = vec![]; - let mut delayed = None; + let mut deferred = None; // Build the list of stack children. for child in args.all() { match child { - StackChild::Spacing(_) => delayed = None, + StackChild::Spacing(_) => deferred = None, StackChild::Node(_) => { - if let Some(v) = delayed { + if let Some(v) = deferred { children.push(StackChild::spacing(v)); } - delayed = spacing; + deferred = spacing; } } children.push(child); -- cgit v1.2.3