From 3531c46fb8d0661447d96b3539b7de33e7581c95 Mon Sep 17 00:00:00 2001 From: David Laban Date: Thu, 11 Aug 2016 21:09:29 +0100 Subject: [PATCH] sort --merge --unique This uses Itertools' dedup() rather than Vec::dedup(). There is probably a cleaner, more polymorphic way to do this. Suggestions welcome. --- src/sort/Cargo.toml | 1 + src/sort/sort.rs | 21 +++++++++++++++------ tests/test_sort.rs | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/sort/Cargo.toml b/src/sort/Cargo.toml index 545206f57..f8de86672 100644 --- a/src/sort/Cargo.toml +++ b/src/sort/Cargo.toml @@ -11,6 +11,7 @@ path = "sort.rs" getopts = "*" libc = "*" semver = "*" +itertools = "*" uucore = { path="../uucore" } [[bin]] diff --git a/src/sort/sort.rs b/src/sort/sort.rs index 15d655ecf..2fda643fc 100644 --- a/src/sort/sort.rs +++ b/src/sort/sort.rs @@ -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, 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,10 +273,20 @@ fn exec(files: Vec, settings: &Settings) -> i32 { } } else if settings.merge { - print_sorted(file_merger, &settings.outfile) + if settings.unique { + print_sorted(file_merger.dedup(), &settings.outfile) + } + else { + print_sorted(file_merger, &settings.outfile) + } } else { - print_sorted(lines.iter(), &settings.outfile) + if settings.unique { + print_sorted(lines.iter().dedup(), &settings.outfile) + } + else { + print_sorted(lines.iter(), &settings.outfile) + } } 0 diff --git a/tests/test_sort.rs b/tests/test_sort.rs index 0075ddbe4..9c6ccff71 100644 --- a/tests/test_sort.rs +++ b/tests/test_sort.rs @@ -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()