Skip to content

Instantly share code, notes, and snippets.

View Lucifier129's full-sized avatar
🎯
Focusing

工业聚 Lucifier129

🎯
Focusing
View GitHub Profile
var noop = () => {}
var compose = (f1, f2) => (...args) => f1(f2(...args))
var range = (start, end) => {
let n = start
let f = (next, complete) => {
if (n <= end) {
next(n++)
f(next, complete)
} else {
complete()
@Lucifier129
Lucifier129 / codata-lens-state-machine.ts
Created July 13, 2022 08:12
Modular state-management via codata & lens & state-machine
type PrimitiveData = string | number | boolean | null
type ListData = LensData[]
type ObjectData = {
[key: string]: LensData
}
type LensData = PrimitiveData | ListData | ObjectData
@Lucifier129
Lucifier129 / push-stream.ts
Created July 8, 2022 09:53
push-stream via codata
function pipe<A, B>(a: A, f: (a: A) => B): B;
function pipe<A, B, C>(a: A, f: (a: A) => B, g: (b: B) => C): C;
function pipe<A, B, C, D>(
a: A,
f: (a: A) => B,
g: (b: B) => C,
h: (c: C) => D
): D;
function pipe<A, B, C, D, E>(
a: A,
@Lucifier129
Lucifier129 / pull-stream.ts
Last active July 7, 2022 09:40
pull-stream via codata
function pipe<A, B>(a: A, f: (a: A) => B): B;
function pipe<A, B, C>(a: A, f: (a: A) => B, g: (b: B) => C): C;
function pipe<A, B, C, D>(
a: A,
f: (a: A) => B,
g: (b: B) => C,
h: (c: C) => D
): D;
function pipe<A, B, C, D, E>(
a: A,
@Lucifier129
Lucifier129 / codata.ts
Last active July 3, 2022 12:08
some codata examples in javascript/typescript
interface BtreeVisitor<T, TT> {
leaf: (value: T) => TT;
branch: (left: TT, right: TT) => TT;
}
interface Btree<T> {
<TT>(visitor: BtreeVisitor<T, TT>): TT;
}
const leaf = <T>(value: T): Btree<T> => {
use std::collections::HashMap;
extern crate peg;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
struct Variable(String);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
enum Value {
Integer(i32),
Variable(Variable),
@Lucifier129
Lucifier129 / todo-app.remesh
Created November 16, 2021 07:38
A showcase of Remesh DSL
domain TodoInputDomain {
state TodoInput = ''
command updateTodoInput(newTodoInput: string) {
return TodoInput.new(newTodoInput)
}
}
type Todo = {
const first = source => {
if (!source) return 'empty source'
return [source[0], source.slice(1)]
}
// console.log('first', first('abc'), first(''))
const inject = value => source => [value, source]
// console.log('inject', inject(1)('123'), inject(2)(''))
// library
type Handler<T, R> = [new (...args: any) => T, (input: T) => R];
type HandlerPattern<T extends Handler<any, any>> = T extends Handler<
infer Pattern,
any
>
? Pattern
: unknown;
type Prettier<T> = {
[key in keyof T]: T[key];
}
type Tagged<Tag extends string> = {
tag: Tag;
};
type Field<Key extends string, Value> = {
[key in Key]: Value;