code: func (e Equalities) DeepEqual(a1, a2 interface{}) bool {
  	if a1 == nil || a2 == nil {
  		return a1 == a2
  	}
  	v1 := reflect.ValueOf(a1)
  	v2 := reflect.ValueOf(a2)
  	if v1.Type() != v2.Type() {
  		return false
  	}
  	return e.deepValueEqual(v1, v2, make(map[visit]bool), 0)
  }
docs: // DeepEqual is like reflect.DeepEqual, but focused on semantic equality
  // instead of memory equality.
  //
  // It will use e's equality functions if it finds types that match.
  //
  // An empty slice *is* equal to a nil slice for our purposes; same for maps.
  //
  // Unexported field members cannot be compared and will cause an imformative panic; you must add an Equality
  // function for these types.