Skip to content

Instantly share code, notes, and snippets.

sshark /
Last active May 20, 2024 15:41
An exercise to implement Monad in Scala 3
trait Functor[F[_]]:
def map[A, B](fa: F[A])(f: A => B): F[B]
trait Monad[F[_]] extends Functor[F]:
def unit[A](a: A): F[A]
def flatMap[A, B](fa: F[A])(f: A => F[B]): F[B]
def map[A, B](fa: F[A])(f: A => B): F[B] = flatMap(fa)(x => unit(f(x)))
object Monad:
def apply[F[_]](using ev: Monad[F]): Monad[F] = ev
import scala.concurrent.*
def delay(delay: Long)(id: String) = Future {
println(s"$id done")
def fast(id: String) = delay(500)(id)
//import cats.Applicative
//import cats.implicits.*
def sequence[A, F[_], G[_]](fga: F[G[A]])(using Traverse[F], Applicative[G]): G[F[A]] =
trait Traverse[F[_]]:
def traverse[A, B, G[_]](fa: F[A])(f: A => G[B])(using Applicative[G]): G[F[B]]
package th.lim.dojo3.concurrent
import cats.effect.std.{Console, Random, SecureRandom}
import cats.effect.{IO, IOApp}
import cats.syntax.all.{toFlatMapOps, toFunctorOps}
import cats.{FlatMap, Functor}
/** An example of using Random[F] in additional to
sshark /
Last active February 25, 2024 09:03
Uses flags or poison pill to synchronize producers and consumers
package org.teckhooi;
import java.time.Duration;
import java.util.LinkedList;
import java.util.Optional;
import java.util.Queue;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
sshark /
Last active February 18, 2024 17:04
Controlled threads execution
package th.lim;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
* Suppose we have the following code:
* class Foo {
* void first() {...}
sshark /
Last active February 16, 2024 17:38
Tagless final vs tagless initial vs tagged initial
/** This is a summary of this website
* with the example written in
* Scala.
* This is an example of tagged initial encoding. It is tagged because
* SqlExprResult is used to streamlined the returned values. It is initial
* encoding because eval has to perform pattern matching.
* Use GADT (Generalized Algebraic Data Type) to make it tag-less initial
* encoding.
sshark / CancellableTask.scala
Last active November 28, 2023 15:42
Demonstrate cancellable tasks are cancelled while they are sleeping
package org.teckhooi.dojo3.concurrent
import cats.effect.{IO, IOApp}
import scala.concurrent.duration.*
object CancellableTask extends IOApp.Simple {
def task(i: Int, d: Duration): IO[Unit] = IO.sleep(d) *> IO.println(s"Task $i completed")
override def run: IO[Unit] = for {
package org.teckhooi.concurrent
import cats.effect.{IO, IOApp}
import cats.implicits.catsSyntaxFlatMapOps
object ParTraverseApp extends IOApp.Simple {
override def run: IO[Unit] = {
def parTraverse[A, B](as: List[A])(f: A => IO[B]): IO[List[B]] = => f(a).start)
.foldLeft(IO.pure(List.empty[B]))((ioList, ioFibre) =>
sshark /
Last active May 27, 2023 16:44
deep copy list of maps
import java.util.*;
public class ListMapDeepCopy {
static <A, B> void deepCopy(List<Map<A,B>> target, List<Map<A,B>> source ) {
source.forEach(m -> target.add(new HashMap<>(m)));
public static void main(String[] args) {
Map<String, Integer> foobar1 = new HashMap<>();