From 42089dcf7b69d9213e12f3463c3f30b6bf60656d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 14 Dec 2025 12:40:49 +0000 Subject: [PATCH 1/2] Initial plan From e099896d29e10a6b98eb12611b4a0d617a5794d7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 14 Dec 2025 12:47:11 +0000 Subject: [PATCH 2/2] Make namespace classes final with private constructors Co-authored-by: Garciat <118277+Garciat@users.noreply.github.com> --- src/main/java/com/garciat/typeclasses/TypeClasses.java | 4 +++- .../java/com/garciat/typeclasses/impl/ConstructorLookup.java | 4 +++- .../com/garciat/typeclasses/impl/OverlappingInstances.java | 4 +++- src/main/java/com/garciat/typeclasses/impl/Unification.java | 4 +++- .../com/garciat/typeclasses/impl/WitnessInstantiation.java | 4 +++- .../java/com/garciat/typeclasses/impl/WitnessResolution.java | 4 +++- .../java/com/garciat/typeclasses/impl/WitnessSummoning.java | 4 +++- 7 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/garciat/typeclasses/TypeClasses.java b/src/main/java/com/garciat/typeclasses/TypeClasses.java index aed3ea4..1a76d8d 100644 --- a/src/main/java/com/garciat/typeclasses/TypeClasses.java +++ b/src/main/java/com/garciat/typeclasses/TypeClasses.java @@ -10,7 +10,9 @@ import java.util.Arrays; import java.util.List; -public class TypeClasses { +public final class TypeClasses { + private TypeClasses() {} + public static T witness(Ty ty, Ctx... context) { return switch (WitnessSummoning.summon(ParsedType.parse(ty.type()), parseContext(context))) { case Either.Left(SummonError error) -> diff --git a/src/main/java/com/garciat/typeclasses/impl/ConstructorLookup.java b/src/main/java/com/garciat/typeclasses/impl/ConstructorLookup.java index 6dd772a..d4762c5 100644 --- a/src/main/java/com/garciat/typeclasses/impl/ConstructorLookup.java +++ b/src/main/java/com/garciat/typeclasses/impl/ConstructorLookup.java @@ -10,7 +10,9 @@ import java.util.Arrays; import java.util.List; -public class ConstructorLookup { +public final class ConstructorLookup { + private ConstructorLookup() {} + public static List findRules(ParsedType target) { return switch (target) { case ParsedType.App(var fun, var arg) -> Lists.concat(findRules(fun), findRules(arg)); diff --git a/src/main/java/com/garciat/typeclasses/impl/OverlappingInstances.java b/src/main/java/com/garciat/typeclasses/impl/OverlappingInstances.java index 1aa0365..fdbd21c 100644 --- a/src/main/java/com/garciat/typeclasses/impl/OverlappingInstances.java +++ b/src/main/java/com/garciat/typeclasses/impl/OverlappingInstances.java @@ -6,7 +6,9 @@ import com.garciat.typeclasses.impl.WitnessRule.InstanceConstructor; import java.util.List; -public class OverlappingInstances { +public final class OverlappingInstances { + private OverlappingInstances() {} + /** * @implSpec 6.8.8.5. diff --git a/src/main/java/com/garciat/typeclasses/impl/Unification.java b/src/main/java/com/garciat/typeclasses/impl/Unification.java index 0b73712..b3bdf53 100644 --- a/src/main/java/com/garciat/typeclasses/impl/Unification.java +++ b/src/main/java/com/garciat/typeclasses/impl/Unification.java @@ -6,7 +6,9 @@ import java.util.List; import java.util.Map; -public class Unification { +public final class Unification { + private Unification() {} + public static Maybe> unify(ParsedType t1, ParsedType t2) { return switch (Pair.of(t1, t2)) { case Pair(ParsedType.Var var1, ParsedType.Primitive p) -> diff --git a/src/main/java/com/garciat/typeclasses/impl/WitnessInstantiation.java b/src/main/java/com/garciat/typeclasses/impl/WitnessInstantiation.java index 36ba916..f19a165 100644 --- a/src/main/java/com/garciat/typeclasses/impl/WitnessInstantiation.java +++ b/src/main/java/com/garciat/typeclasses/impl/WitnessInstantiation.java @@ -9,7 +9,9 @@ import java.util.Map; import java.util.stream.Collectors; -public class WitnessInstantiation { +public final class WitnessInstantiation { + private WitnessInstantiation() {} + /** Compiles an InstantiationPlan into an Expr. */ public static Expr compile(InstantiationPlan plan) { return switch (plan) { diff --git a/src/main/java/com/garciat/typeclasses/impl/WitnessResolution.java b/src/main/java/com/garciat/typeclasses/impl/WitnessResolution.java index 6e4cb99..c22d4b4 100644 --- a/src/main/java/com/garciat/typeclasses/impl/WitnessResolution.java +++ b/src/main/java/com/garciat/typeclasses/impl/WitnessResolution.java @@ -7,7 +7,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class WitnessResolution { +public final class WitnessResolution { + private WitnessResolution() {} + /** Resolves a ParsedType into an InstantiationPlan. */ public static Either resolve( ParsedType target, List context) { diff --git a/src/main/java/com/garciat/typeclasses/impl/WitnessSummoning.java b/src/main/java/com/garciat/typeclasses/impl/WitnessSummoning.java index e9d2c63..bc41306 100644 --- a/src/main/java/com/garciat/typeclasses/impl/WitnessSummoning.java +++ b/src/main/java/com/garciat/typeclasses/impl/WitnessSummoning.java @@ -4,7 +4,9 @@ import com.garciat.typeclasses.types.Either; import java.util.List; -public class WitnessSummoning { +public final class WitnessSummoning { + private WitnessSummoning() {} + public static Either summon( ParsedType target, List context) { return WitnessResolution.resolve(target, context)