Skip to content

Instantly share code, notes, and snippets.

@palladin
palladin / Index.cs
Last active August 14, 2023 11:18
Composable Index
using System.Linq;
public static class Index
{
public static Index<TKey, TValue> Create<TKey, TValue>()
where TKey : notnull
{
var keyMap = new Dictionary<TKey, HashSet<TValue>>();
Action<TKey, TValue> add = (key, value) =>
@palladin
palladin / Eff.cs
Created July 12, 2023 19:54
Eff with static abstract members
using Nessos.Effects;
using Nessos.Effects.Handlers;
public class ConsolePrintEffect : Effect
{
public string? Message { init; get; }
}
@palladin
palladin / dropwhile.fs
Last active July 4, 2023 12:41
dropWhile using foldr
let dropWhile : ('a -> bool) -> list<'a> -> list<'a> = fun pred xs ->
let (_, ys) = List.foldBack (fun x (xs, ys) -> let xs' = x :: xs in if pred x then xs', ys else xs', xs') xs ([], [])
ys
// example 1
[1..10] |> dropWhile (fun x -> x <= 5) // [6..10]
// example 2
[1..10] |> dropWhile (fun x -> false) // [1..10]
@palladin
palladin / powerset.ts
Created June 2, 2022 14:06
Type level PowerSet in TypeScript
type Append<T, TArray> = TArray extends [infer TCurrent, ...infer Rest] ?
TCurrent extends any[] ? [[T, ...TCurrent], ...Append<T, Rest>] : never
: []
type PowerSet<TArray extends any[]> =
TArray extends [infer TCurrent, ...infer Rest] ? [...Append<TCurrent, PowerSet<Rest>>, ...PowerSet<Rest>] : [[]]
type Test = PowerSet<[1, 2, 3]> // [[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []]
@palladin
palladin / dynamicy.cs
Created May 25, 2017 15:27
Y combinator (dynamic)
using System;
public class C {
public void M() {
Func<Func<dynamic, dynamic>, dynamic> fd = x => x;
dynamic Y = fd(f => fd(x => f(fd(y => x(x)(y))))(fd(x => f(fd(y => x(x)(y))))));
Y(fd(f => fd(x => f(x))))(42);
}
}
@palladin
palladin / traversal.cs
Created July 27, 2017 10:25
Node to TreeNode traversal
class Program
{
class Node
{
public int Id;
public Node Parent;
}
class TreeNode
{
@palladin
palladin / Splicer.cs
Created March 18, 2019 17:08
Expression splicing
public class Subs : ExpressionVisitor
{
private Dictionary<ParameterExpression, Expression> env;
public Subs(Dictionary<ParameterExpression, Expression> env)
{
this.env = env;
}
protected override Expression VisitParameter(ParameterExpression node)
{
@palladin
palladin / boolExpr.cs
Created May 15, 2019 15:56
BoolExpr eval
public interface IBoolExpr { }
public class And : IBoolExpr
{
public IBoolExpr Left { get; set; }
public IBoolExpr Right { get; set; }
public void Deconstruct(out IBoolExpr left, out IBoolExpr right)
{
left = Left;
right = Right;
}
@palladin
palladin / output.fs
Created May 19, 2019 15:43
Stream fusion output
let f (x0 : int []) =
let x1 = ref 0
let x2 = ref true
let x3 = ref false
let x4 = ref 0
let x5 = ref 0
let x6 = ref true
let x7 = ref true
let x8 = ref 0
let x9 = ref 0
@palladin
palladin / output.fs
Created May 22, 2019 12:21
Example3 output
let f (x0 : int[]) (x1 : int[]) =
let x2 = ref 0
let x3 = ref true
let x4 = ref false
let x5 = ref 0
let x6 = ref 0
let x7 = ref true
let x8 = ref true
let x9 = ref 0
let x10 = ref 0