frees-io/iota
{ "createdAt": "2017-04-12T22:00:41Z", "defaultBranch": "master", "description": "Fast [co]product types with a clean syntax. For Cats & Scalaz.", "fullName": "frees-io/iota", "homepage": "", "language": "Scala", "name": "iota", "pushedAt": "2019-09-24T07:38:06Z", "stargazersCount": 176, "topics": [ "algebra", "coproduct", "functional-programming", "iota", "performance-tuning", "scala" ], "updatedAt": "2025-09-17T20:31:15Z", "url": "https://github.com/frees-io/iota"}[comment] !: # (Start Badges)
[comment] !: # (End Badges)
Introduction
Section titled “Introduction”Iota is a tiny library for fast coproduct types with a syntax that cleanly supports the disjunction of any number of types.
Traditional coproduct implementations are implemented as binary trees or linked lists at both the type and value level. The syntax for traditional coproducts frequently becomes unwieldy as the number of disjunct types grows.
// a coproduct of types using scala.util.Eithertype EitherFoo = Either[Int, Either[String, Double]]
// a coproduct of type constructors using cats.data.EitherKimport cats.data.EitherKtype EitherKBar0[A] = EitherK[List, Seq, A]type EitherKBar[A] = EitherK[Option, EitherKBar0, A]
// a coproduct of type constructors using scalaz.Coproductimport scalaz.Coproducttype CoproductKBar0[A] = Coproduct[List, Seq, A]type CoproductKBar[A] = Coproduct[Option, CoproductKBar0, A]Iota coproducts are linked lists at the type level. At the value level, Iota stores the index of the disjunct value’s type for quick and constant time access of the values. This syntax scales cleanly to support any number of disjunct types.
// for catsimport iota._import TList.::import TListK.:::
// a coproduct of typestype Foo = Cop[Int :: String :: Double :: TNil]
// a coproduct of type constructorstype Bar[A] = CopK[Option ::: List ::: Seq ::: TNilK, A]// for scalazimport iotaz._import TList.::import TListK.:::
// a coproduct of typestype Foo = Cop[Int :: String :: Double :: TNil]
// a coproduct of type constructorstype Bar[A] = CopK[Option ::: List ::: Seq ::: TNilK, A]Installation
Section titled “Installation”To get started with SBT, simply add the following to your build.sbt file.
For Scala 2.11.x and 2.12.x:
[comment] !: # (Start Replace)
libraryDependencies += "io.frees" %% "iota-core" % "0.3.10" // for catslibraryDependencies += "io.frees" %% "iotaz-core" % "0.3.10" // for scalazOr, if using Scala.js (0.6.x):
libraryDependencies += "io.frees" %%% "iota-core" % "0.3.10" // for catslibraryDependencies += "io.frees" %%% "iotaz-core" % "0.3.10" // for scalaz[comment] !: # (End Replace)
Cats vs Scalaz
Section titled “Cats vs Scalaz”Iota requires either Cats or Scalaz. If you’re using Scalaz, use the “iotaz”
modules and import from the iotaz package (instead of iota).
Cats friendly terminology (such as “FunctionK”) is used in the iota modules while Scalaz friendly terminology (such as “NaturalTransformation”) is used in the iotaz modules. If you find an issue or inconsistency, please file a GitHub issue and it will be fixed.
The Cats examples will work against Scalaz, and vise versa, so long as the library specific terminology is adjusted. Expect more Scalaz examples as the Iota library evolves.
Documentation
Section titled “Documentation”See [docs/cats.md]!(docs/cats.md) for the Cats specific documentation and [docs/scalaz.md]!(docs/scalaz.md) for the Scalaz specific documentation.
Iota in the wild
Section titled “Iota in the wild”If you wish to add your library here please consider a PR to include it in the list below.
Commercial Support
Section titled “Commercial Support”47 Degrees offers commercial support for the iota library and associated technologies. To find out more, visit 47 Degrees’ Open Source Support.
[comment] !: # (Start Copyright)
Copyright
Section titled “Copyright”Iota is designed and developed by 47 Degrees
Copyright (C) 2016-2018 47 Degrees. http://47deg.com
[comment] !: # (End Copyright)
[free example] !: modules/tests/src/test/scala/iotatests/FreeCopKTests.scala