require IEquatable<T> for State