Graph{{
        public Iterator<Adj<N,L>> iterator(){ return adj.iterator(); }
        public List<Adj<N,L>> adjList(){ return adj; }
        public Adj<N,L> adjList(final Node<N> n){
            return adj.find(new List.Pred<Adj<N,L>>(){
                    public boolean huh(Adj<N,L> a){ return n.same(a.node); }
                });
        }
        public List<Node<N>> nodes(){
            return adj.map(new List.Map<Adj<N,L>,Node<N>>(){
                    public Node<N> map(Adj<N,L> a){ return a.getNode(); }
                });
        }
        public List<Edge<N,L>> edges(final Node<N> n){ return adjList(n).es; }
}}

Node{{
        public boolean same(Node<N> n){ return n.id == id; }
        public int hashCode(){ return id; }
}}

Adj{{
        public Iterator<Edge<N,L>> iterator(){ return es.iterator(); }
}}