Architecture Decision Records

ADRs document the significant design choices made in dmx-fun — the context that led to each decision, the alternatives considered, and the consequences accepted. They are the authoritative record of why the library is built the way it is.

# Title Status Date
001 Java 25 as the minimum required version Accepted 2026-05-05
002 JPMS from day one Accepted 2026-05-05
003 Sealed interfaces + records as ADT representation Accepted 2026-05-05
004 Try<V> allows Success(null); Result.Ok rejects null Accepted 2026-05-05
005 Guard<T> accumulates errors as a fixed NonEmptyList<String> Accepted 2026-05-05
006 Validated (error accumulation) vs Result (fail-fast) Accepted 2026-05-05
007 Either as a neutral type with no directional bias Accepted 2026-05-05
008 jspecify (@NullMarked, @Nullable) for null safety Accepted 2026-05-05
009 unmodifiableList instead of List.copyOf in Try Accepted 2026-05-05
010 Gatherer for sequence/traverse with true short-circuit Accepted 2026-05-05
011 Guard<T> as a @FunctionalInterface with default methods Accepted 2026-05-05
012 Lazy<T> with volatile Try<T> and double-checked locking Accepted 2026-05-05
013 Try.withTimeout uses virtual threads (Thread.ofVirtual()) Accepted 2026-05-05
014 Facade collectors (Results, Options, Tries) as a single entry point Accepted 2026-05-05
015 Option<T> as a custom type instead of java.util.Optional Accepted 2026-05-09
016 Try.toList() collector consumes the entire stream while sequence is fail-fast Accepted 2026-05-09
017 Result.groupingBy returns Map<K, NonEmptyList<V>> instead of Map<K, List<V>> Accepted 2026-05-09
018 NonEmptyList<T>, NonEmptySet<T>, NonEmptyMap<K,V> as structural guarantee types Accepted 2026-05-09
019 CheckedFunction, CheckedSupplier, CheckedRunnable, CheckedConsumer as first-class interfaces Accepted 2026-05-09
020 Accumulator<E, A> (Writer monad) — rationale for inclusion Accepted 2026-05-09
021 Resource<T> as composable managed resource — alternative to try-with-resources Accepted 2026-05-09
022 Integration modules as optional peer dependencies Accepted 2026-05-09