func (e Edge) LeftPrev() Edge {
	e.id = e.pool.next[e.id].sym()
	return e
}
LeftPrev returns the previous counter-clockwise edge with the same left face.
package quadedge
import (
	"strconv"
)
type Edge struct {
	pool *Pool
	id   edgeID
}
type edgeID uint32
const (
	Nil = 0xFFFFFFFF
	canonical edgeID = 0xFFFFFFFC
	quad edgeID = 0x00000003
)
func (e Edge) String() string {
	if e.id == Nil {
		return "[no edge]"
	}
	on := e.pool.next[e.id]
	o := "orig:" +
		datastring(e.pool, e.id) +
		"->" + on.String()
	rn := e.pool.next[e.id.rot()]
	r := " right:" +
		datastring(e.pool, e.id.rot()) +
		"->" + rn.String()
	dn := e.pool.next[e.id.sym()]
	d := " dest:" +
		datastring(e.pool, e.id.sym()) +
		"->" + dn.String()
	ln := e.pool.next[e.id.tor()]
	l := " left:" +
		datastring(e.pool, e.id.tor()) +
		"->" + ln.String()
	return e.id.String() + "=[" + o + r + d + l + "]"
}
func (e edgeID) String() string {
	if e == Nil {
		return "no_edge"
	}
	var s string
	switch e & quad {
	case 0:
		s = "o"
	case 1:
		s = "r"
	case 2:
		s = "d"
	case 3:
		s = "l"
	default:
		s = "error"
	}
	return strconv.Itoa(int(e>>2)) + "" + s
}
func datastring(p *Pool, e edgeID) string {
	d := p.data[e]
	if d == Nil {
		return ""
	}
	return strconv.Itoa(int(d))
}
func (e Edge) Pool() *Pool {
	return e.pool
}
func (e edgeID) rot() edgeID {
	return (e & canonical) + ((e + 1) & quad)
}
func (e edgeID) sym() edgeID {
	return (e & canonical) + ((e + 2) & quad)
}
func (e edgeID) tor() edgeID {
	return (e & canonical) + ((e + 3) & quad)
}
func (e Edge) Canonical() Edge {
	e.id = e.id & canonical
	return e
}
func (e Edge) Rot() Edge {
	e.id = (e.id & canonical) + ((e.id + 1) & quad)
	return e
}
func (e Edge) Sym() Edge {
	e.id = (e.id & canonical) + ((e.id + 2) & quad)
	return e
}
func (e Edge) Tor() Edge {
	e.id = (e.id & canonical) + ((e.id + 3) & quad)
	return e
}
func (e Edge) OrigNext() Edge {
	e.id = e.pool.next[e.id]
	return e
}
func (e Edge) RightNext() Edge {
	e.id = e.pool.next[e.id.rot()].tor()
	return e
}
func (e Edge) DestNext() Edge {
	e.id = e.pool.next[e.id.sym()].sym()
	return e
}
func (e Edge) LeftNext() Edge {
	e.id = e.pool.next[e.id.tor()].rot()
	return e
}
func (e Edge) OrigPrev() Edge {
	e.id = e.pool.next[e.id.rot()].rot()
	return e
}
func (e Edge) RightPrev() Edge {
	e.id = e.pool.next[e.id.sym()]
	return e
}
func (e Edge) DestPrev() Edge {
	e.id = e.pool.next[e.id.tor()].tor()
	return e
}