Skip to content

Instantly share code, notes, and snippets.

View justinhj's full-sized avatar

Justin Heyes-Jones justinhj

View GitHub Profile
@justinhj
justinhj / WriterTFailure.scala
Created July 27, 2019 07:02
WriterT failing
import cats._
import cats.instances._
import cats.syntax._
import cats.data.Validated._
type ErrorOr[A] = Validated[String, A]
def logDivide(a: Int, b: Int) = WriterT[ErrorOr, String, Int](
divide[ErrorOr](a,b) match {
case Invalid(e) => Invalid("Division by zero\n")
@justinhj
justinhj / typeclasspatternexample.scala
Created July 16, 2019 15:49
From @Kaishh on functional programming Slack
// kaishh [4:20 AM]
// Found a neat way to always have typeclass syntax available without any wildcards imports:
package mypkg {
trait Functor[F[_]] {
def map[A, B](fa: F[A])(f: A => B): F[B]
}
final class FunctorOps[F[_], A](private val fa: F[A]) extends AnyVal {
def map[B](f: A => B)(implicit F: Functor[F]): F[B] = F.map(fa)(f)
}
@justinhj
justinhj / FizzBuzzFs.scala
Created July 15, 2019 17:07
Another fizz buzz
import fs2._
import cats._
import cats.implicits._
object Fs2FizzBuzz {
val fb = Stream.emits(List(None, None, "Fizz".some)).
repeat.
zip(Stream.emits(List(None, None, None, None, "Buzz".some)).
repeat).
@ val fb = Stream.emits(List("", "", "fizz")).repeat.zip(Stream.emits(List("", "", "", "", "buzz")).repeat).map{case (a,b) => a |+| b}
fb: Stream[Nothing, String] = Stream(..)
@ fb.take(30).toList
res37: List[String] = List(
"",
"",
"fizz",
"",
"buzz",
@justinhj
justinhj / fizzbuzz.scala
Created July 13, 2019 17:57
Fizz buzz as FS2 streams
val fb = Stream.emits(List(false, false, true)).repeat.zip(Stream.emits(List(false,false,false,false,true)).repeat).map{
case (true,true) => "fizzbuzz"
case (true,false) => "fizz"
case (false,true) => "buzz"
case (false,false) => ""
}
//fb: Stream[Nothing, String] = Stream(..)
// @ fb.take(30).toList
// res27: List[String] = List(
@justinhj
justinhj / uPickleRules.scala
Last active July 10, 2019 18:23
Serialize and deserialize a map with a case class key
// "com.lihaoyi" %% "upickle" % "0.7.5",
import upickle.default.{read,write}
import upickle.default.{ReadWriter => RW, macroRW}
object PickleMap {
case class KeyClass(s: String, i: Int)
object KeyClass{
implicit val rw: RW[KeyClass] = macroRW
@justinhj
justinhj / lolcompose.scala
Created July 9, 2019 19:08
Flatmap from unit and compose
object ComposePlay {
// Compose takes two Kleisli arrows ( A => F[B], B => F[C] ) and returns A => F[C]
// Here I implement unit and compose for Option
// Then flatMap is implemented using compose showing that you can make a Monad
// with unit and compose...
def unitOption[A](a : A) : Option[A] = Some(a)
@justinhj
justinhj / ActorWithQueue.scala
Created July 4, 2019 12:50
Pub Sub Akka actor with Zio Queue
import zio._
import zio.console._
import zio.{Queue, UIO}
import akka.actor._
import com.typesafe.config.ConfigFactory
import java.util.concurrent.Executors
import scala.concurrent.{ExecutionContext}
import scala.concurrent.duration.FiniteDuration
import java.util.concurrent.{Executors, TimeUnit}
import java.util.concurrent.{ExecutorService, Executors, ThreadFactory}
@justinhj
justinhj / StateTEither.scala
Created June 23, 2019 21:48
StateT with Either for error handling
import cats._
import cats.implicits._
import cats.data.StateT
object Radio {
case class Radio(volume: Int)
type RadioError = String
type RadioEither[A] = Either[RadioError, A]
type RadioStateEitherT[A] = StateT[RadioEither, Radio, A]
// Comonad is the dual of Monad
// example for non empty list, extract is the head of the list
// coflatMap gives you successive lists from the whole list, the tail, the tail of that
// and you must return a single value for each list...
@ Comonad[NonEmptyList].extract(NonEmptyList.of(1,2,3))
res26: Int = 1
@ Comonad[NonEmptyList].extract(NonEmptyList.of(1))
res27: Int = 1