Skip to content

Instantly share code, notes, and snippets.

@bishabosha
bishabosha / summon-semigroup-maybe-oldway.scala
Created November 15, 2021 16:00
demonstration that the cats style of type class definition and syntax does not play well with type inference
// using scala 3.1.0
package mycats:
trait Semigroup[A]:
def combine(a1: A, a2: A): A
class SemigroupOps[A](a1: A)(implicit ev: Semigroup[A]):
def combine(a2: A): A = ev.combine(a1, a2)
@bishabosha
bishabosha / summon-semigroup-Maybe.scala
Created November 15, 2021 15:20
Summon a Semigroup for Maybe, defined as an enum
// using scala 3.1.0
// using lib org.typelevel::cats-core:2.6.1
package good
import cats.Semigroup
import cats.syntax.all.*
enum Maybe[+A]:
case Just(a: A)
@bishabosha
bishabosha / OpaqueTypeEntities.worksheet.sc
Created March 10, 2021 14:40
Demonstrate using Opaque Type Aliases as evidence parameters to abstract over different storage
object Notarisation:
private case object Proven
opaque type Proof <: Singleton = Proven.type
given Proof = Proven
end Notarisation
import Notarisation.Proof
@bishabosha
bishabosha / migrating-package-objects-with-extends.md
Created January 23, 2020 13:40
Migrating package objects with extends clauses

Here is a trait in package p

package p
trait Aliases { type Env = A with B }

In Scala 2, you could do this:

package object p extends Aliases
@bishabosha
bishabosha / prettyPrint.scala
Last active April 16, 2019 23:49
Dotty tail recursive object pretty print - naive indentation
type StackT = List[String]
type StatT = StackT => StackT
type ProgT = List[StatT]
def prettyPrint(
a: Any,
indentSize: Int = 2,
maxElementWidth: Int = 60,
depth: Int = 0): String = {