AtCoder Beginner Contest 246 A(2)

https://atcoder.jp/contests/abc246/tasks/abc246_a

selectにVecではなく、できればiteratorを渡したいですよね。
オブジェクト指向が抜けないと

fn select(v: Iterator<i32>) -> Option<i32> {

みたいに書きそうですが、std::iter::Iteratorはtraitなので、Genericsを使って、

fn select<T: Iterator<Item=i32>>(v: T) -> Option<i32> {

と書かないといけないんですね。

// Four Points
#![allow(non_snake_case)]

use std::collections::HashMap;

fn read<T: std::str::FromStr>() -> T {
	let mut line = String::new();
	std::io::stdin().read_line(&mut line).ok();
	line.trim().parse().ok().unwrap()
}

#[derive(Copy, Clone)]
struct Point {
	x: i32,
	y: i32,
}

fn read_point() -> Point {
	let v: Vec<i32> = read::<String>().split_whitespace()
					.map(|e| e.parse().ok().unwrap()).collect();
	Point { x: v[0], y: v[1] }
}

fn read_points() -> Vec<Point> {
	(0..3).map(|_| read_point()).collect()
}

fn select<T: Iterator<Item=i32>>(v: T) -> Option<i32> {
	let mut m = HashMap::<i32,i32>::new();
	for x in v {
		let counter = m.entry(x).or_insert(0);
		*counter += 1;
	}
	
	let res = m.iter().filter(|(&_key, &val)| val == 1).next();
	match res {
		Some((&key, &_val)) => Some(key),
		_                   => None
	}
}

fn main() {
	let points = read_points();
	let xs = points.iter().map(|pt| pt.x);
	let some_x = select(xs);
	let ys = points.iter().map(|pt| pt.y);
	let some_y = select(ys);
	match (some_x, some_y) {
		(Some(x), Some(y)) => println!("{} {}", x, y),
		_                  => ()
	}
}