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.

#TitleStatusDate
001Java 25 as the minimum required versionAccepted2026-05-05
002JPMS from day oneAccepted2026-05-05
003Sealed interfaces + records as ADT representationAccepted2026-05-05
004Try<V> allows Success(null); Result.Ok rejects nullAccepted2026-05-05
005Guard<T> accumulates errors as a fixed NonEmptyList<String>Accepted2026-05-05
006Validated (error accumulation) vs Result (fail-fast)Accepted2026-05-05
007Either as a neutral type with no directional biasAccepted2026-05-05
008jspecify (@NullMarked, @Nullable) for null safetyAccepted2026-05-05
009unmodifiableList instead of List.copyOf in TryAccepted2026-05-05
010Gatherer for sequence/traverse with true short-circuitAccepted2026-05-05
011Guard<T> as a @FunctionalInterface with default methodsAccepted2026-05-05
012Lazy<T> with volatile Try<T> and double-checked lockingAccepted2026-05-05
013Try.withTimeout uses virtual threads (Thread.ofVirtual())Accepted2026-05-05
014Facade collectors (Results, Options, Tries) as a single entry pointAccepted2026-05-05
015Option<T> as a custom type instead of java.util.OptionalAccepted2026-05-09
016Try.toList() collector consumes the entire stream while sequence is fail-fastAccepted2026-05-09
017Result.groupingBy returns Map<K, NonEmptyList<V>> instead of Map<K, List<V>>Accepted2026-05-09
018NonEmptyList<T>, NonEmptySet<T>, NonEmptyMap<K,V> as structural guarantee typesAccepted2026-05-09
019CheckedFunction, CheckedSupplier, CheckedRunnable, CheckedConsumer as first-class interfacesAccepted2026-05-09
020Accumulator<E, A> (Writer monad) — rationale for inclusionAccepted2026-05-09
021Resource<T> as composable managed resource — alternative to try-with-resourcesAccepted2026-05-09
022Integration modules as optional peer dependenciesAccepted2026-05-09
023Project Reactor as the reactive interop targetAccepted2026-06-29