Skip to content
cats-effect-io logo

cats-effect-io

Scala functional programming with Cats Effect IO and typeclasses. Use for wrapping side effects, modeling purity, choosing Sync/Async/Temporal/Concurrent, handling blocking I/O, and composing resources, fibers, and concurrency safely.

NeverSight/skills_feed0installs214stars

SKILL.md

Full skill instructions

Cats Effect IO (Scala)

Quick start

  • Treat every side effect as an effect value: return IO[A], SyncIO[A], or F[A] with F[_]: Sync/Async/Temporal as needed.
  • Wrap Java blocking calls with IO.blocking or IO.interruptible (or Sync[F].blocking/interruptible).
  • Use Resource to acquire/​release resources and IOApp for program entry points.
  • Prefer structured concurrency (parTraverse, parMapN, background, Supervisor) over manual fiber management.
  • Read references/​cats-effect-io.md for concepts, recipes, and FAQ guidance.
  • For deeper Resource guidance, use the cats-effect-resource skill (install: npx skills add https://github.com/alexandru/skills --skill cats-effect-resource).

Workflow

  1. Classify side effects and choose the effect type: IO directly or polymorphic F[_] with the smallest required Cats Effect typeclass (Sync, Async, Temporal, Concurrent).
  2. Wrap side-effectful code using IO(...), IO.blocking, IO.interruptible, or IO.async (or their Sync/Async equivalents).
  3. Manage resources with Resource or bracket and keep acquisition/​release inside effects.
  4. Compose effects with flatMap/​for-comprehensions and collection combinators (traverse, parTraverse).
  5. Use concurrency primitives (Ref, Deferred, Queue, Semaphore, Supervisor) and structured concurrency to avoid fiber leaks.

Side-effect rules (apply to IO, SyncIO, and to F[_]: Sync/​Async)

  • All side-effectful functions must return results wrapped in IO (or F[_] with Cats Effect typeclasses).
  • Side-effects include all non-determinism (call sites are not referentially transparent):
    • Any I/​O (files, sockets, console, databases).
    • Instant.now(), Random.nextInt().
    • Any read from shared mutable state (the read itself is the side effect).
    • Returning mutable data structures (for example, Array[Int]).

Blocking I/​O rules

  • Java blocking methods must be wrapped in IO.blocking or IO.interruptible (or Sync[F].blocking/interruptible) so they run on the blocking pool.
  • Prefer IO.interruptible for methods that may throw InterruptedException or IOException, but not for resource disposal.
  • Use IO.blocking for cleanup/​disposal (Closeable#close, AutoCloseable#close).

Output expectations

  • Make side effects explicit in signatures (IO/SyncIO or F[_]: Sync/​Async); the guidance here applies equally to concrete IO and polymorphic F[_].
  • Use the smallest typeclass constraint that supports the needed operations.
  • Keep effects as values; do not execute effects in constructors or top-level vals.

References

  • Load references/​cats-effect-io.md for documentation summary and patterns.
  • For concrete samples, read references/​cats-effect-io.md.
  • Use the cats-effect-resource skill for Resource-specific workflows and patterns (install: npx skills add https://github.com/alexandru/skills --skill cats-effect-resource).