Newts defines newtypes compatible with cats typeclasses.
libraryDependencies ++= Seq(
"com.github.julien-truffaut" %% "newts-core" % "0.3.2"
)
Example
Using cats
you can squash values using Monoid
or Semigroup
instance (based on if your data structure can be empty):
import cats.data.NonEmptyList
import cats.instances.all._
import cats.syntax.all._
val ints = 1.to(100).toList
val intNel = NonEmptyList(1, 2.to(100).toList)
val strings = List("abc", "cde", "fgh")
scala> ints.combineAll
res0: Int = 5050
scala> intNel.reduce
res1: Int = 5050
scala> strings.combineAll
res2: String = abccdefgh
However, some types have more than one valid instance of a typeclass, e.g. (+, 0)
and (*, 1)
are two
completely valid Monoid
. A solution to this problem is to chose one instance somehow arbitrarily and create a wrapper
type for each other implementation. This pattern is called newtype and it comes from the haskell language.
import cats.Monoid
implicit val longMonoid: Monoid[Long] = new Monoid[Long] {
def empty: Long = 0
def combine(x: Long, y: Long): Long = x + y
}
case class Mult(value: Long)
implicit val longMult: Monoid[Mult] = new Monoid[Mult] {
def empty: Mult = Mult(1)
def combine(x: Mult, y: Mult): Mult = Mult(x.value * y.value)
}
Here are a few examples of newtypes define in newts
:
import newts._
scala> ints.foldMap(i => LastOption(Some(i)))
res3: newts.LastOption[Int] = LastOption(Some(100))
scala> intNel.reduceMap(First(_))
res4: newts.First[Int] = First(1)
scala> intNel.reduceMap(Min(_))
res5: newts.Min[Int] = Min(1)
scala> intNel.reduceMap(Max(_))
res6: newts.Max[Int] = Max(100)
scala> strings.foldMap(Dual(_))
res7: newts.Dual[String] = Dual(fghcdeabc)
Instead of using newtype constructors, one can use newts.syntax
:
import newts.syntax.all._
import cats.syntax.all._
scala> strings.foldMap(_.asDual)
res8: newts.Dual[String] = Dual(fghcdeabc)
scala> ints.foldMap(_.some.asLastOption)
res9: newts.LastOption[Int] = LastOption(Some(100))
Maintainers and contributors
The current maintainers (people who can merge pull requests) are:
- Julien Truffaut - @julien-truffaut
and the contributors (people who committed to newts).
Copyright and license
Newts is licensed under the [Apache License, Version 2.0][http://www.apache.org/licenses/LICENSE-2.0] (the “License”); you may not use this software except in compliance with the License.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.