Login light
// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/

// See page 99.

// Graph shows how to use a map of maps to represent a directed graph.
package main

import "fmt"

//!+
var graph = make(map[string]map[string]bool)

func addEdge(from, to string) {
    edges := graph[from]
    if edges == nil {
        edges = make(map[string]bool)
        graph[from] = edges
    }
    edges[to] = true
}

func hasEdge(from, to string) bool {
    return graph[from][to]
}

//!-

func main() {
    addEdge("a", "b")
    addEdge("c", "d")
    addEdge("a", "d")
    addEdge("d", "a")
    fmt.Println(hasEdge("a", "b"))
    fmt.Println(hasEdge("c", "d"))
    fmt.Println(hasEdge("a", "d"))
    fmt.Println(hasEdge("d", "a"))
    fmt.Println(hasEdge("x", "b"))
    fmt.Println(hasEdge("c", "d"))
    fmt.Println(hasEdge("x", "d"))
    fmt.Println(hasEdge("d", "x"))

}