diff --git a/Cargo.lock b/Cargo.lock index b73e607..7bd8c90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -173,7 +173,7 @@ checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "folgezettel" -version = "0.2.0" +version = "0.3.0" dependencies = [ "camino", "clap", diff --git a/Cargo.toml b/Cargo.toml index 381aa20..e48532a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "folgezettel" -version = "0.2.0" +version = "0.3.0" edition = "2024" description = "Index Folgezettel identifiers from note files" readme = "README.md" diff --git a/src/id.rs b/src/id.rs index 518222e..d20c69b 100644 --- a/src/id.rs +++ b/src/id.rs @@ -21,7 +21,9 @@ impl Ord for Segment { fn cmp(&self, other: &Self) -> Ordering { match (self, other) { (Self::Number(left), Self::Number(right)) => left.cmp(right), - (Self::Letter(left), Self::Letter(right)) => left.cmp(right), + (Self::Letter(left), Self::Letter(right)) => { + left.len().cmp(&right.len()).then_with(|| left.cmp(right)) + } (Self::Separator(left), Self::Separator(right)) => left.cmp(right), _ => { let rank = |segment: &Segment| match segment { @@ -205,6 +207,18 @@ fn normalizes_uppercase_letters() { ); } +#[test] +fn orders_letter_runs_by_length_then_value() { + let mut ids: Vec<_> = ["1aa", "1z", "1ab", "1a", "1b"] + .iter() + .map(|id| FolgezettelId::parse(id).unwrap()) + .collect(); + ids.sort(); + + let sorted: Vec = ids.iter().map(FolgezettelId::to_string).collect(); + assert_eq!(sorted, ["1a", "1b", "1z", "1aa", "1ab"]); +} + #[test] fn handles_separators() { assert_eq!(