func (v *View) MoveAt(nw Point, fn Iterator) {
	size := v.rect.Max.Subtract(v.rect.Min)
	v.Resize(Rect{
		Min: nw,
		Max: nw.Add(size),
	}, fn)
}
MoveAt moves the viewport to a specific coordinate.
package tile
import (
	"sync"
)
type Update struct {
	Point  
	Tile   
}
type View struct {
	Grid  *Grid        
	Inbox chan Update  
	rect  Rect         
}
func (v *View) Resize(box Rect, fn Iterator) {
	owner := v.Grid  
	prev := v.rect   
	v.rect = box     
	if prev.Min.X >= 0 || prev.Min.Y >= 0 || prev.Max.X >= 0 || prev.Max.Y >= 0 {
		owner.pagesWithin(prev.Min, prev.Max, func(page *page) {
			if bounds := page.Bounds(); !bounds.Intersects(box) {
				if owner.observers.Unsubscribe(page.point, v) {
					page.SetObserved(false)  
				}
			}
		})
	}
	owner.pagesWithin(box.Min, box.Max, func(page *page) {
		if bounds := page.Bounds(); !bounds.Intersects(prev) {
			if owner.observers.Subscribe(page.point, v) {
				page.SetObserved(true)  
			}
		}
		if fn != nil {
			page.Each(func(p Point, tile Tile) {
				if !prev.Contains(p) && box.Contains(p) {
					fn(p, tile)
				}
			})
		}
	})
}
func (v *View) MoveBy(x, y int16, fn Iterator) {
	v.Resize(Rect{
		Min: v.rect.Min.Add(At(x, y)),
		Max: v.rect.Max.Add(At(x, y)),
	}, fn)
}