use std::fmt;
use std::cmp::min;
pub use self::tilenet::{TileNet, TileNetProxy};
mod tilenet;
#[derive(Clone)]
pub struct TileSet<'a, T, I>
where T: 'a
{
tilenet: &'a TileNet<T>,
points: I,
last_coord: (i32, i32),
}
impl<'a, T, I> TileSet<'a, T, I>
where T: 'a,
I: Iterator<Item = (i32, i32)>
{
pub fn get_coords(&self) -> (i32, i32) {
self.last_coord
}
}
impl<'a, T, I> Iterator for TileSet<'a, T, I>
where T: 'a,
I: Iterator<Item = (i32, i32)>
{
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
loop {
if let Some(point) = self.points.next() {
self.last_coord = point;
if point.0 >= 0 && point.1 >= 0 && point.0 < self.tilenet.get_size().0 as i32 &&
point.1 < self.tilenet.get_size().1 as i32 {
return self.tilenet.get((point.0 as usize, point.1 as usize));
} else {
continue;
}
} else {
return None;
}
}
}
}
impl<'a, T, I> fmt::Debug for TileSet<'a, T, I>
where T: 'a + Clone + fmt::Debug,
I: Clone + Iterator<Item = (i32, i32)>
{
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
let viewer = self.clone();
for tile in viewer {
try!(write!(formatter, "{:?} ", tile));
}
Ok(())
}
}
#[derive(Clone)]
pub struct TileView<'a, T>
where T: 'a
{
tilenet: &'a TileNet<T>,
rectangle: (usize, usize, usize, usize),
current: (usize, usize),
}
impl<'a, T> TileView<'a, T>
where T: 'a
{
fn new(tilenet: &'a TileNet<T>,
mut rectangle: (usize, usize, usize, usize))
-> TileView<'a, T> {
rectangle.1 = min(rectangle.1, tilenet.get_size().0);
rectangle.3 = min(rectangle.3, tilenet.get_size().1);
TileView {
tilenet: tilenet,
rectangle: rectangle,
current: (rectangle.0, rectangle.2),
}
}
}
impl<'a, T> Iterator for TileView<'a, T>
where T: 'a
{
type Item = (&'a T, usize, usize);
fn next(&mut self) -> Option<Self::Item> {
if self.current.1 >= self.rectangle.3 {
return None;
}
let tile = self.tilenet.get(self.current).map(|x| (x, self.current.0, self.current.1));
self.current.0 += 1;
if self.current.0 >= self.rectangle.1 {
self.current.1 += 1;
self.current.0 = self.rectangle.0;
}
tile
}
}
impl<'a, T> fmt::Debug for TileView<'a, T>
where T: 'a + Clone + fmt::Debug
{
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
let biggest = self.clone().map(|x| format!("{:?}", x).len()).max();
let viewer = self.clone();
let width = viewer.rectangle.1 - viewer.rectangle.0;
for (index, tile) in viewer.enumerate() {
if index % width == 0 && index != 0 {
try!(formatter.write_str("\n"));
}
let mut current = format!("{:?}", tile);
let length = current.len();
if let Some(biggest) = biggest {
(0..biggest - length).map(|_| current.push(' ')).count();
}
try!(write!(formatter, "{} ", current));
}
Ok(())
}
}