package com.example.portfolio3;

// origin: <https://moodle.ruc.dk/course/section.php?id=211877>

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

///  Adjecency List Graph - A map from vertices to set of outedges from the vertex
public class AdjListGraph extends AbstractGraph {

  /// foo
  public AdjListGraph() {}

  /// foo
  private Map<Vertex,Set<Edge>> outEdge= new HashMap<>();

  /// foo
  public void insertEdge(Vertex v1,Vertex v2,int w){
    Edge e=new Edge(v1,v2,w);
    if(!outEdge.containsKey(e.from()))
      outEdge.put(e.from(),new HashSet<Edge>());
    outEdge.get(e.from()).add(e);
  }

  /// foo
  public Collection<Edge> edges(){
    Set<Edge> edges=new HashSet<>();
    for(Vertex v:outEdge.keySet())edges.addAll(outEdge.get(v));
    return edges;
  }

  /// foo
  public Collection<Edge> outEdge(Vertex v){
    if(!outEdge.containsKey(v))
      return new HashSet<Edge>();
    return outEdge.get(v);
  }

  /// foo
  public Integer getWeight(Vertex v1,Vertex v2){
    // linear in number of outedges from vertices
    if(!outEdge.containsKey(v1))return null;
    for(Edge e:outEdge.get(v1)){
      if(e.to()==v2)return e.weight();
    }
    return null;
  }
}