Arrow
KotlinFunctional programming toolkit for Kotlin Multiplatform
Arrow's largest production cycle has 5 files, at the heart of its error-handling types. Most entry points are generated documentation examples.
Call resolution (28,305 call sites)
- Resolved in the repository
- 5,605
- To libraries or the standard library
- 13,424
- Ambiguous (several possible targets)
- 2,552
- Unresolved (could be repo code)
- 6,724
The rate above is resolved ÷ (resolved + ambiguous + unresolved). Calls to libraries and the standard library cannot reach this repository, so they are shown separately and left out of it. Test code is included in these counts.
What the analysis shows
Either.kt, NonEmptyList.kt, NonEmptySet.kt, Raise.kt and RaiseAccumulate.kt depend on each other. These are Arrow's core error-handling types.
304 of the analyzed files are documentation examples generated by the Knit tool under jvmTest/kotlin/examples. The analyzer lists 225 program entry points (219 of them those examples' main functions) and 34 Ktor routes in the arrow-raise-ktor-server integration.
28,305 call sites; 20% resolve inside the repository. atomically in the STM module is called from 105 files.
An import of arrow.atomic.Atomic can mean several platform-specific actual declarations. The analyzer links it to one of them (androidAndJvmMain), so dependencies on platform-specific code reflect that choice.
Re-analyzed with the current analyzer, the same commit gives the same files, module dependencies and cycles as the October demo (813 files, 354 module dependencies, 3 cycle groups). More calls resolve: 5,605 inside the repository, against 1,718 in October. Kotlin calls are now resolved with the type information of the Kotlin compiler itself (without building the project): calls on inferred types, call chains, scope functions such as let and apply, and extension functions such as left() and right(). The analysis took 181.0 s with a peak of 1,085 MB (October: 53.2 s, 403 MB).
Largest cycle group
- arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Either.kt
- arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/NonEmptyList.kt
- arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/NonEmptySet.kt
- arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/raise/Raise.kt
- arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/raise/RaiseAccumulate.kt
Most widely called symbols (calling files)
- arrow-libs/fx/arrow-fx-stm/src/commonMain/kotlin/arrow/fx/stm/STM.kt#arrow.fx.stm.atomically (105)
- arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Either.kt#arrow.core.A::left (37)
- arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Either.kt#arrow.core.A::right (33)
- arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Either.kt#arrow.core.Either.Companion.catch (30)
- arrow-libs/fx/arrow-fx-coroutines/src/commonMain/kotlin/arrow/fx/coroutines/Resource.kt#arrow.fx.coroutines.resourceScope (27)
- arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/raise/Builders.kt#arrow.core.raise.either (25)
Endpoints (first rows of the inventory)
- DELETE /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::deleteOrRaise(Regex,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
- DELETE /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::deleteOrRaise(String,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
- GET /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::getOrRaise(Regex,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
- GET /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::getOrRaise(String,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
- HEAD /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::headOrRaise(Regex,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
- HEAD /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::headOrRaise(String,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
- OPTIONS /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::optionsOrRaise(Regex,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
- OPTIONS /{?}/{?} -> arrow-libs/integrations/arrow-raise-ktor-server/src/commonMain/kotlin/arrow/raise/ktor/server/routing/routing.kt#arrow.raise.ktor.server.routing.Route::optionsOrRaise(String,HttpStatusCode?,RespondingRaiseRoutingHandler).<lambda#1>
8 of 34 shown
Compared with the October 2026 demo
The same commit, analyzed again with the current analyzer. Both columns use the same definitions; differences come from analyzer changes, explained in the findings above where they matter. The October demo recorded only the resolved-call count, so the other call-resolution rows show the current analyzer only.
| Measure | October 2026 demo | Current analyzer |
|---|---|---|
Files analyzed graph nodes (Go: packages) | 813 | 813 |
Source lines (SLOC) non-blank, non-comment lines of analyzed files | 68,066 | 68,066 |
Module dependencies distinct file-to-file links, test-only and name-match links excluded | 354 | 354 |
Relationship records all edge rows of every kind, including links to external symbols | 4,806 | 4,806 |
Cycle groups groups of files that depend on each other | 3 | 3 |
Largest cycle (files) size of the largest cycle group | 5 | 5 |
Most-imported module distinct production importers of the top module | 35 (Either.kt) | 35 (Either.kt) |
Call sites resolved in repo calls resolved to a function inside the repository / all call sites | 1,718 / 28,305 | 5,605 / 28,305 |
Calls to libraries (external) calls into other packages or the language's standard library | n/a | 13,424 |
Ambiguous calls calls with several possible targets inside the repository | n/a | 2,552 |
Unresolved calls calls that could reach repository code but were not pinned to a target | n/a | 6,724 |
Resolved of in-repo calls resolved / (resolved + ambiguous + unresolved): external calls cannot reach the repository | n/a | 38% |
Framework registrations routes, handlers, hooks, entry points with resolution status | 265 | 265 |
Architectural zones package-hierarchy zones | 189 | 189 |
Analysis time (s) wall time of the analysis call | 53.2 | 181 |
Peak memory (MB) container memory peak during the analysis | 403 | 1,085 |
Limitations
- Most of
Either.kt's importers are tests: 35 production files import it. - 24% of call sites stay unresolved, mostly calls on receivers whose type the analysis could not determine.
- Static analysis records relationships visible in the source. It does not see dynamic loading, reflection, or behaviour at runtime; verify important conclusions in the code.
Download the analysis
A full bundle of a large repository exceeds many models' context windows; the focused slices below answer one question each in a fraction of the size.
Focused slices
Every cycle group with its members and size.
scc-summary
The most depended-on and most dependent files, with the reasons they rank high.
hub-summary
Everything that depends on the main hub, two levels deep.
blast-radius
Test-side callers reachable from the most-called symbol (see limitations).
affected-tests
Detected frameworks and how their registrations were resolved.
framework-summary
Routes and handlers, with method, path and target.
framework-inventory
Resolved calls to the most-called symbol, with call sites.
call-diagnostics
Ready to run this on your own codebase?
Hosted analyses use the same analyzer as this demo, within your usage limits.