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 |