Skip to content

Instantly share code, notes, and snippets.

View ShahOdin's full-sized avatar
🎋

Shah Saraei ShahOdin

🎋
View GitHub Profile
@ShahOdin
ShahOdin / cats-effect-demo2.scala
Created November 11, 2019 12:25
playing around with cats-effect
import cats.effect.{IO, IOApp}
object Demo extends IOApp {
import cats.effect._
import cats.effect.concurrent._
import cats.syntax.functor._
import cats.syntax.parallel._
import cats.instances.list._
import cats.syntax.flatMap._
val DemoNumbers: List[Int] = (0 until 100).toList
@ShahOdin
ShahOdin / cats-effect-demo.scala
Last active November 3, 2019 01:14
two examples of resource management scenarios
package com.itv.sif.db
import cats.effect.IOApp
import java.util.concurrent.Executors
import fs2.Stream
import cats.syntax.functor._
import scala.concurrent.ExecutionContext
import cats.effect._
object demo extends IOApp {
implicit def catsDataMonadForNested[F[_]: Monad, G[_]: Monad: Traverse]: Monad[Nested[F, G, *]] = new StackSafeMonad[Nested[F, G, *]]{
override def flatMap[A, B](fa: Nested[F, G, A])(f: A => Nested[F, G, B]): Nested[F, G, B] = Nested(
fa.value.flatMap{
Traverse[G].flatTraverse(_)(f.andThen(_.value))
}
)
@ShahOdin
ShahOdin / TSRangeMeta.scala
Last active July 3, 2019 10:21
my failed attempt at implementing a meta instance for tsrange
case class TimeWindow(from: Instant, until: Instant)
implicit def tsrange: Meta[TimeWindow] = {
def toString(timeWindow: TimeWindow): String =
s"[" +
s"${Timestamp.from(timeWindow.from).toString}," +
s"${Timestamp.from(timeWindow.until).toString}" +
s")"
import org.scalatest.{FlatSpec, Matchers}
import cats.effect.{ContextShift, IO}
import com.dimafeng.testcontainers.{ForAllTestContainer, PostgreSQLContainer}
import doobie._
import implicits._
import com.itv.playground.datastore._
import JsonCRUDOps._
import io.circe.{Decoder, Encoder}
type Id = Int
type Film = String
type Series = String
type Episode = String
type Url = String
case class DataBaseClient(url: Url) {
def get(s:String, id: Id): String = "foo"
}
object Client1 {
@ShahOdin
ShahOdin / curry.scala
Last active October 1, 2018 13:37
currying is not just for partial application
object Model {
//the types don't mean anything, just faking some models.
type Config = Float
type ID = Int
type Age = Int
type DateInString = String
type DateSinceEpoch = Float
}
//example of api changing where the first parameter is changed.
@ShahOdin
ShahOdin / dependencyInjection.scala
Last active September 27, 2018 13:52
dependency injection by passing parameterised functions
trait Pen
type Drawing = Unit
trait Side
case object Right extends Side
case object Left extends Side
object Drawing {
//pens everywhere, distracting us from the main drawing logic
object CirceDecoderCombination {
sealed trait Base
case class StringField(field1: String) extends Base
case class IntField(field2: Int) extends Base
case class FloatField(field3: Float) extends Base
import io.circe.{Decoder, Encoder}
import io.circe.generic.auto._
@ShahOdin
ShahOdin / Par.scala
Created September 21, 2018 09:10 — forked from orium/Par.scala
Par
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, ExecutionContext, Future}
object ParImpl {
sealed trait Par[A] {
def toFuture(implicit ec: ExecutionContext): Future[A] = {
this match {
case Par.Unit(f) => Future(f())
case x:Par.Map2[A,_,_] =>
for {