Skip to content

Instantly share code, notes, and snippets.

View SegFaultAX's full-sized avatar

Michael-Keith Bernard SegFaultAX

View GitHub Profile
@SegFaultAX
SegFaultAX / guestlib.py
Created March 14, 2019 19:58
vmGuestLib [Python] [ctypes]
from ctypes import CDLL, c_void_p, byref
from ctypes.util import find_library
# The following code fails on ubuntu 18.04, but succeeds on 14.04
lib = CDLL(find_library('guestlib'))
handle = c_void_p()
ret = lib.VMGuestLib_OpenHandle(byref(handle))
if ret != 0:
raise RuntimeError("failed to get handle")
@SegFaultAX
SegFaultAX / reader.scala
Last active March 22, 2019 21:16
Reader Monad [Scala]
object ReaderMonad extends App {
case class Reader[-E, +A](run: E => A) {
def map[B](fn: A => B): Reader[E, B] =
dimap((e: E) => e)(fn)
def contramap[E0](fn: E0 => E): Reader[E0, A] =
dimap(fn)(a => a)
def dimap[E0, B](f: E0 => E)(g: A => B): Reader[E0, B] =
Reader(e0 => g(run(f(e0))))
@SegFaultAX
SegFaultAX / dice.py
Created December 21, 2018 08:40
Complex Dice Expression Parser and Evaluator [Python]
import re
import random
import parsec as p
import dataclasses as dc
###########
### AST ###
###########
@SegFaultAX
SegFaultAX / io.py
Created December 18, 2018 03:03
Simple IO monad [Python]
#!/usr/bin/env python
import functools
import typing as ty
from dataclasses import dataclass
A = ty.TypeVar("A")
B = ty.TypeVar("B")
@SegFaultAX
SegFaultAX / free.py
Created December 17, 2018 08:48
Simple Free Monad [Python]
import dataclasses as dc
import typing as ty
import inspect
import functools
S = ty.TypeVar("S")
A = ty.TypeVar("A")
B = ty.TypeVar("B")
@dc.dataclass(frozen=True)
@SegFaultAX
SegFaultAX / Combinators.kt
Created October 29, 2018 16:48
Minimalist Parser Combinator Library [Kotlin] [WIP]
fun <A, B, R> curry2(fn: (A, B) -> R): (A) -> (B) -> R = { a -> { b -> fn(a, b) } }
fun <A, B, C, R> curry3(fn: (A, B, C) -> R): (A) -> (B) -> (C) -> R = { a -> { b -> { c -> fn(a, b, c) } } }
fun <A, B> const(a: A, b: B): A = a
fun <A, B, C> flip(fn: (A, B) -> C): (B, A) -> C = { b, a -> fn(a, b) }
infix fun <A, B> Parser<A>.pairing(p: Parser<B>): Parser<Pair<A, B>> =
Parser.liftA2(curry2(::Pair), this, p)
infix fun <A> Parser<A>.or(p: Parser<A>): Parser<A> =
this alt p
@SegFaultAX
SegFaultAX / Fold.java
Last active October 8, 2018 21:32
Functional composable applicative streaming monoidal folds v2 [Java]
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
public interface Fold<Acc, From, To> {
Monoid<Acc> ev();
Acc quantify(From x);
To combine(Acc acc);
default To fold(Collection<From> xs) {
@SegFaultAX
SegFaultAX / Monoid.java
Last active October 6, 2018 18:23
Functional composable applicative streaming monoidal folds [Java]
import java.util.function.BiFunction;
import java.util.function.Supplier;
public interface Monoid<T> extends Semigroup<T> {
T empty();
static <T> Monoid<T> of(Supplier<T> v, BiFunction<T, T, T> app) {
return new Monoid<>() {
@Override
public T empty() {
@SegFaultAX
SegFaultAX / Fold.java
Last active October 6, 2018 18:21
Functional composable applicative streaming folds [Java]
import java.util.Collection;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
public interface Fold<Acc, From, To> {
Acc empty();
Acc step(Acc acc, From x);
To combine(Acc acc);
@SegFaultAX
SegFaultAX / ChainTest.java
Created October 1, 2018 21:32
An either-based pipeline example [Java]
import static org.assertj.core.api.Assertions.assertThat;
import java.util.function.Function;
import org.junit.Test;
import io.atlassian.fugue.Either;
public class ChainTest {
static class Context<T, Status extends Enum<Status>> {