Mouse is a small companion to the Cats functional programming library and the Scala standard library.
The library arose from this Cats issue and is a Typelevel member.
Mouse is published for Scala 2.12, 2.13 and 3.0. For Scala.jvm:
"org.typelevel" %% "mouse" % version
For scala.js 1.x:
"org.typelevel" %%% "mouse" % version
Learn more about Mouse at https://typelevel.org/mouse/.
Mouse includes enrichments for:
- Any
- Boolean
- Double
- F[A] for any F, A
- F[Either[A, B]]
- F[Option[A]]
- F[G[A]]
- F[G[H[A]]]
- F[TupleN]
- Int
- List
- Long
- Map
- Option
- Set
- String
- Try
- Tuple
scala>importmouse.all._importmouse.all._
scala>true.option("Its true!")
res0:Option[String] =Some(Itstrue!)
scala>defmakeEven(i: Int) = (i %2==1).applyIf(i)(_ -1)
defmakeEven(i: Int):Int
scala>vale1:Either[String, Int] =Left("failed")
e1:Either[String,Int] =Left(failed)
scala>true.whenA(e1)
res0:Either[String,Unit] =Left(failed)
scala>false.whenA(e1)
res1:Either[String,Unit] =Right(())
scala> res0.cata(msg =>s"Message received: ${msg}", "No message")
res1:String=Messagereceived: Itstrue!
scala>"1.0".parseFloat
res0:Either[NumberFormatException, Float] =Right(1.0F)
scala>"foo".parseIntValidated
res1: cats.data.Validated[NumberFormatException,Int] =Invalid(java.lang.NumberFormatException:For input string: "foo")
scala>valt1= scala.util.Try(new java.net.URL("https://www.github.com"))
t1: scala.util.Try[java.net.URL] =Success(https://www.github.com)
scala> t1.cata(msg =>s"URL is valid!", error =>s"URL is invalid: ${error.getMessage}")
res1:String=URL is valid!
scala> t1.toEither
res2:Either[Throwable,java.net.URL] =Right(https://www.github.com)
scala>valt2= scala.util.Try(new java.net.URL("https//www.github.com"))
t2: scala.util.Try[java.net.URL] =Failure(java.net.MalformedURLException: no protocol: https//www.github.com)
scala> t2.cata(msg =>s"URL is valid!", error =>s"URL is invalid: ${error.getMessage}")
res3:String=URL is invalid: no protocol: https//www.github.com
scala> t2.toEither
res4:Either[Throwable,java.net.URL] =Left(java.net.MalformedURLException: no protocol: https//www.github.com)
scala>valintToBytes=123456789.toByteArray
intToBytes:Array[Byte] =Array(7, 91, -51, 21)
scala>vallongToBase64=123456789L.toBase64
longToBase64:String=AAAAAAdbzRU
scala>5.squared
res0:Int=25
scala>1.5|> (_.toInt) |> (_.toString)
res0:String=1//lift a partial function into a total function to an Either, when you want to treat unhandled input cases as an error
scala> liftEither[Option[Int]]({caseSome(n) => n}, a =>s"Unexpected: $a")(Some(6))
res0:Either[String,Int] =Right(6)
scala>valmapped=Map(1->2, 3->4).mapKeys(_ *2)
mapped:Map[Int,Int] =Map(2->2, 6->4)
scala>valfoption=List(Option(1), Option(2), Option(4)).mapIn(_ *2)
foption:List[Option[Int]] =List(Some(2), Some(4), Some(8))
scala>valfeither=List(Either.cond(true, 1, "0")).mapIn(_ *2)
feither:List[Either[String, Int]] =List(Right(2))
scala>vallistOption=List(Option(1), Option(2)).mapNested2(_ *2)
listOption:List[Option[Int]] =List(Some(2), Some(4))
scala>vallistOptionList=List(Option(List(1)), Option(List(2))).mapNested3(_ *2)
listOptionList:List[Option[List[Int]]] =List(Some(List(2)), Some(List(4)))
scala>valtupleHead= (1, 2, 4, 8).head
tupleHead:Int=1
scala>valtupleLast= (1, 2, 4, 8).last
tupleLast:Int=8
scala>Set(0).tailOrEmpty
valres3:Set[Int] =Set()
scala>Nil.tailOrEmpty
valres1:List[Nothing] =List()
scala>Set(0).tailOption
valres4:Option[cats.data.NonEmptySet[Int]] =None
scala>List(0,1,2).tailOption
valres5:Option[cats.data.NonEmptyList[Int]] =Some(NonEmptyList(1, 2))- Provide enrichments to classes from the Scala standard library that convert to Cats datatypes, or otherwise improve the functional programming experience.
Mouse is maintained by @benhutchison and @danicheg.
Issues and pull requests are welcome. Code contributions should be aligned with the above scope to be included, and include unit tests. See contributing guide for more details.
This project supports the Scala code of conduct and aims that its channels (mailing list, Gitter, github, etc.) to be welcoming environments for everyone.