<commit_before>
namespace Raccoon {
    public struct Location {
        public int X, Y;

        public Location(int x, int y) {
            X = x;
            Y = y;
        }

        public override int GetHashCode() {
            int hashCode = 486187739;

            unchecked {
                hashCode = hashCode * 23 + X.GetHashCode();
                hashCode = hashCode * 23 + Y.GetHashCode();
            }

            return hashCode;
        }

        public override bool Equals(object o) {
            return o is Location location && location.X == X && location.Y == Y;
        }

        public override string ToString() {
            return $"{X}, {Y}";
        }
    }
}<commit_msg>feat: improvements to Location<commit_after>
namespace Raccoon {
    public struct Location {
        public static readonly Location Zero = new Location(0, 0),
                                        Unit = new Location(1, 1),
                                        UnitX = new Location(1, 0),
                                        UnitY = new Location(0, 1);

        public int X, Y;

        public Location(int x, int y) {
            X = x;
            Y = y;
        }

        public Location PerpendicularCCW() {
            return new Location(Y, -X);
        }

        public Location PerpendicularCW() {
            return new Location(-Y, X);
        }

        public override int GetHashCode() {
            int hashCode = 486187739;

            unchecked {
                hashCode = hashCode * 23 + X.GetHashCode();
                hashCode = hashCode * 23 + Y.GetHashCode();
            }

            return hashCode;
        }

        public override bool Equals(object o) {
            return o is Location location && location.X == X && location.Y == Y;
        }

        public override string ToString() {
            return $"{X}, {Y}";
        }

        public static bool operator ==(Location l, Location r) {
            return l.X == r.X && l.Y == r.Y;
        }

        public static bool operator !=(Location l, Location r) {
            return l.X != r.X || l.Y != r.Y;
        }

        public static Location operator -(Location l) {
            return new Location(-l.X, -l.Y);
        }

        public static Location operator +(Location l, Location r) {
            return new Location(l.X + r.X, l.Y + r.Y);
        }

        public static Location operator -(Location l, Location r) {
            return new Location(l.X - r.X, l.Y - r.Y);
        }

        public static Location operator *(Location l, Location r) {
            return new Location(l.X * r.X, l.Y * r.Y);
        }

        public static Location operator *(Location l, int v) {
            return new Location(l.X * v, l.Y * v);
        }

        public static Location operator *(int v, Location r) {
            return new Location(v * r.X, v * r.Y);
        }
    }
}
{'fraction_non_alphanumeric': 0.10417385305277682, 'fraction_numerical': 0.011728182131769576, 'mean_word_length': 1.3368251410153102, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '778389', 'n_tokens_mistral': 823, 'n_tokens_neox': 765, 'n_words': 259}