Skip to content

Instantly share code, notes, and snippets.


Gavin Bisesi Daenyth

View GitHub Profile
Daenyth / resetTimeout.scala
Created August 12, 2022 13:49
resetTimeout fs2
View resetTimeout.scala
/** Execute `onTimeout` every time the stream goes `timeout` duration with no
* elements
def resetTimeout[F[_]: Temporal, A](
timeout: FiniteDuration,
onTimeout: F[Unit]
): fs2.Pipe[F, A, A] = {
def go(timedPull: Pull.Timed[F, A]): Pull[F, A, Unit] =
timedPull.timeout(timeout) >>
timedPull.uncons.flatMap {
Daenyth / doobie.scala
Created June 9, 2022 14:47
Doobie code structure example
View doobie.scala
package myapp.users
// This is the shape of code I've found to work best for doobie in a cats-effect application using capability traits
trait UserOnboarding[F[_]] {
// The api expresses the business-level workflow, not the implementation of inserting to a database
// Keep the interface expressing the high level concern; database is only *one* implementation and it can change later
def registerUser(userInfo: UserInfo): F[UserId]
View RawSqlInstances.scala
import cats.{Contravariant, Functor, Semigroupal}
import slick.jdbc.{
trait RawSqlInstances {
Daenyth / ssh-config
Last active April 21, 2022 12:08
Use a different ssh key for a specific github organization
View ssh-config
# ~/.ssh/config
Match host exec "[[ $(git remote get-url origin | sed 's/^.*://' | sed 's/\/.*//') = TheGithubOrganization ]]"
# Don't forget to ssh-add this in addition to other keys, or git will pick one that's already in the agent first
IdentityFile ~/.ssh/specific_rsa
Daenyth / munit-cats-laws.scala
Created March 1, 2022 14:41
munit-discipline cats law testing example
View munit-cats-laws.scala
import cats.kernel.laws.discipline.SemigroupTests
import cats.syntax.all._
import munit.DisciplineSuite
import org.scalacheck.Arbitrary
case class MyInt(value: Int)
object MyInt {
implicit val semigroupMyInt: Semigroup[MyInt] = Semigroup.instance((x1, x2) => MyInt(x1.value + x2.value))
Daenyth / toki-pona-words.txt
Last active January 15, 2022 13:00
lines in /usr/share/dict/words that match toki pona phonotactics
View toki-pona-words.txt
Daenyth / Prelude.scala
Created January 14, 2022 14:47
cats-effect prelude
View Prelude.scala
package com.myproject.prelude
import cats.syntax.{AllSyntaxBinCompat => CatsSyntax}
import cats.effect.syntax.{AllSyntax => CESyntax}
import cats.effect.instances.{AllInstances => CEInstances}
/** Custom prelude for importing with -Yimport
* This means we never need to import cats syntax or stream explicitly
Daenyth / VulcanHelper.scala
Created November 22, 2021 14:26
fs2-kafka vulcan => avro Serde helper
View VulcanHelper.scala
import cats.effect.Sync
import cats.syntax.all._
import cats.effect.std.Dispatcher
import fs2.kafka.vulcan.{AvroSettings, avroDeserializer, avroSerializer}
import fs2.kafka.{Deserializer, Headers, Serializer}
import org.apache.kafka.common.serialization.{Serde, Serdes}
import vulcan.Codec
// Credit to Fede Fernández for the original CE2 version
// Note: this isn't under an open source license; it's for educational purposes only
Daenyth /
Last active August 25, 2021 12:48

Keybase proof

I hereby claim:

  • I am daenyth on github.
  • I am daenyth ( on keybase.
  • I have a public key ASCSw0W8Kr-JKKaGIAxIIOqY3h1MuLZzNqx2epHUbiLD4Qo

To claim this, I am signing this object:

Daenyth /
Last active June 2, 2022 15:43
What's a monad

"Monad" is a word that describes a set of behaviors

In scala, we use the Monad[Foo] typeclass from cats to define instances of this behavior.

The essence of its behavior is the ability to describe a series of computations, where one computation depends on the result of the computation that came before it.

For example, Monad[Option] shows that the Option[A] data type can be used to describe computations of A which may result in no value.