Skip to content

Instantly share code, notes, and snippets.

interface Traced<E, S : Trace.Stage> {
val trace: Trace<E, S>
}
data class EffectTracer<E : Traced<E, Trace.Stage.Out>, M : Traced<E, Trace.Stage.In>> internal constructor(
private val state: State,
private val factory: (Trace<E, Trace.Stage.Out>) -> E
) {
fun launch(): Pair<EffectTracer<E, M>, Set<E>> {
@happy-bracket
happy-bracket / hlist.kt
Created February 18, 2020 17:12
HList in Kotlin, but better!
sealed class HList {
object HNil : HList()
data class HNode<V, T : HList>(val value: V, val next: T) : HList()
data class HPlus<H1 : HList, H2 : HList>(val h1: H1, val h2: H2) : HList() // note this!
}
@happy-bracket
happy-bracket / hbuilder.kt
Created February 6, 2020 10:27
HList-like Builder question mark ?
fun main() {
mock<WriteRound<Int, WriteRound<String, WriteRound<Boolean, Terminate>>>>()
.set(3)
.set("sss")
.set(true)
}
fun <T> mock(): T = TODO()
val src: List<Single<Unit>> = ...
fun sink(result: Single<Unit>) { ... }
src.map { it.toObservable().k() }
.sequence(ObservableK.applicative()).fix()
.map { Unit }
.observable
.firstElement()
.also(::sink)
@happy-bracket
happy-bracket / freesample.kt
Created January 16, 2020 09:05
Free monad, but in Kotlin!
fun main() {
val result = Free.fx<ForStore, String> {
put("arrow", "huita").bind()
update<String>("arrow") { "let's me do this" }.bind()
val arrow = get<String>("arrow").bind()
put("arrow-huita", "I have spoken").bind()
delete("arrow-huita")
arrow ?: ""
}
@happy-bracket
happy-bracket / khlist.kt
Created January 9, 2020 11:46
HList, but in Kotlin!
sealed class HList<T>
object HNil : HList<Nothing>()
data class HNode<T, H : HList<*>>(
val value: T,
val next: H
) : HList<H>()
infix fun <A, B> A.hcons(b: B): HNode<B, HNode<A, HNil>> =
@happy-bracket
happy-bracket / ln.kt
Created January 9, 2020 10:10
Chainable lateinit
class Lateinit<T> {
private var value: T? = null
private var dependants = mutableListOf<Dependant<T, *>>()
operator fun getValue(thisRef: Any?, kprop: KProperty<*>): T =
value ?: throw Exception()
operator fun setValue(thisRef: Any?, kprop: KProperty<*>, v: T) {
value = v
@happy-bracket
happy-bracket / tea.hs
Last active December 26, 2019 11:18
TEA, but in Haskell
{-# LANGUAGE GADTs #-}
module Main where
newtype Login = Login String
newtype Password = Password String
data LoginState = Auth {
login :: Login,
password :: Password
} | Nop
@happy-bracket
happy-bracket / EitherN.kt
Created December 25, 2019 12:55
EitherN, but beter
sealed class Either2<A, B> {
data class Op1<A>(val value: A) : Either2<A, Nothing>()
data class Op2<B>(val value: B) : Either2<Nothing, B>()
}
sealed class Either3<A, B, C> : Either2<A, B>() {
data class ChatState(
val messages: List<Message> = emptyList(),
val input: String = ""
)
sealed class ChatMutation {
data class NewMessage(val message: Message) : ChatMutation()
data class NewInput(val input: String) : ChatMutation()
object SendMessage : ChatMutation()
}