1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

sort --merge --unique

This uses Itertools' dedup() rather than Vec::dedup(). There is probably
a cleaner, more polymorphic way to do this. Suggestions welcome.
This commit is contained in:
David Laban 2016-08-11 21:09:29 +01:00
parent e1af1520e7
commit 3531c46fb8
3 changed files with 30 additions and 6 deletions

View file

@ -11,6 +11,7 @@ path = "sort.rs"
getopts = "*"
libc = "*"
semver = "*"
itertools = "*"
uucore = { path="../uucore" }
[[bin]]

View file

@ -17,6 +17,8 @@ extern crate semver;
#[macro_use]
extern crate uucore;
#[macro_use]
extern crate itertools;
use std::cmp::Ordering;
use std::collections::BinaryHeap;
@ -26,6 +28,7 @@ use std::mem::replace;
use std::path::Path;
use uucore::fs::is_stdin_interactive;
use semver::Version;
use itertools::Itertools; // for Iterator::dedup()
static NAME: &'static str = "sort";
static VERSION: &'static str = env!("CARGO_PKG_VERSION");
@ -261,10 +264,6 @@ fn exec(files: Vec<String>, settings: &Settings) -> i32 {
sort_by(&mut lines, &settings);
if settings.unique {
lines.dedup()
}
if settings.check {
for (i, line) in lines.iter().enumerate() {
if line != &original_lines[i] {
@ -274,11 +273,21 @@ fn exec(files: Vec<String>, settings: &Settings) -> i32 {
}
}
else if settings.merge {
if settings.unique {
print_sorted(file_merger.dedup(), &settings.outfile)
}
else {
print_sorted(file_merger, &settings.outfile)
}
}
else {
if settings.unique {
print_sorted(lines.iter().dedup(), &settings.outfile)
}
else {
print_sorted(lines.iter(), &settings.outfile)
}
}
0

View file

@ -80,6 +80,20 @@ fn test_merge_interleaved() {
.succeeds().stdout_is_fixture("merge_ints_interleaved.expected");
}
#[test]
fn test_merge_unique() {
new_ucmd()
.arg("-m")
.arg("--unique")
.arg("merge_ints_interleaved_1.txt")
.arg("merge_ints_interleaved_2.txt")
.arg("merge_ints_interleaved_3.txt")
.arg("merge_ints_interleaved_3.txt")
.arg("merge_ints_interleaved_2.txt")
.arg("merge_ints_interleaved_1.txt")
.succeeds().stdout_is_fixture("merge_ints_interleaved.expected");
}
#[test]
fn test_merge_reversed() {
new_ucmd()