code: func Visualize(fsm *FSM) string {
  	var buf bytes.Buffer
  
  	states := make(map[string]int)
  
  	buf.WriteString(fmt.Sprintf(`digraph fsm {`))
  	buf.WriteString("\n")
  
  	// make sure the initial state is at top
  	for k, v := range fsm.transitions {
  		if k.src == fsm.current {
  			states[k.src]++
  			states[v]++
  			buf.WriteString(fmt.Sprintf(`    "%s" -> "%s" [ label = "%s" ];`, k.src, v, k.event))
  			buf.WriteString("\n")
  		}
  	}
  
  	for k, v := range fsm.transitions {
  		if k.src != fsm.current {
  			states[k.src]++
  			states[v]++
  			buf.WriteString(fmt.Sprintf(`    "%s" -> "%s" [ label = "%s" ];`, k.src, v, k.event))
  			buf.WriteString("\n")
  		}
  	}
  
  	buf.WriteString("\n")
  
  	for k := range states {
  		buf.WriteString(fmt.Sprintf(`    "%s";`, k))
  		buf.WriteString("\n")
  	}
  	buf.WriteString(fmt.Sprintln("}"))
  
  	return buf.String()
  }
docs: // Visualize outputs a visualization of a FSM in Graphviz format.