parent
b883515a5f
commit
114f32cdc7
@ -1,36 +1,29 @@ |
|||||||
export type L<T extends (v: P) => L<any>> = T & { run: () => T }; |
type F = (v: L) => L<any>; |
||||||
|
|
||||||
export function ___<T extends (v: P) => L<any>>(run: () => T): L<T> { |
export type L<T extends F = F> = T & { run: () => T }; |
||||||
const r: T = ((p: Parameters<T>[0]) => { |
|
||||||
let v: any; |
|
||||||
return ___(() => run()( |
|
||||||
___(() => v ??= p.run()), |
|
||||||
).run()); |
|
||||||
}) as T; |
|
||||||
|
|
||||||
(r as L<T>).run = run; |
const defer: <T extends F>(run: () => T) => L<T> = <T extends F>(run: () => T) => |
||||||
|
Object.assign(((p: Parameters<T>[0]): ReturnType<T> => { |
||||||
|
let v: F; |
||||||
|
return defer(() => run()(defer(() => v ??= p.run())).run()); |
||||||
|
}) as T, { run }); |
||||||
|
|
||||||
return r as L<T>; |
export const _ = <T extends F>(v: T): L<T> => defer(() => v); |
||||||
} |
|
||||||
|
|
||||||
export type P = L<(v: unknown) => L<any>>; |
|
||||||
|
|
||||||
export const _ = <T extends ((v: unknown) => L<any>)>(v: T): L<T> => ___(() => v); |
|
||||||
|
|
||||||
export const fromNative: <T>(v: T) => L<any> |
export const fromNative: <T>(v: T) => L<any> |
||||||
= v => ___(() => v as any); |
= v => defer(() => v as any); |
||||||
export const toNative: <T>(v: L<any>) => T |
export const toNative: <T>(v: L<any>) => T |
||||||
= <T>(v: L<any>) => v.run() as T; |
= <T>(v: L<any>) => v.run() as T; |
||||||
|
|
||||||
export const undef: any = ___(() => { |
export const y = (f: () => L<F>) => defer(() => f().run()); |
||||||
throw new Error('undefined'); |
|
||||||
}); |
export const undef: any = defer(() => { throw new Error('undefined'); }); |
||||||
|
|
||||||
export const id: L<<T extends P>(v: T) => T> |
export const id: L<<T extends L>(v: T) => T> |
||||||
= _(v => v); |
= _(v => v); |
||||||
export const cnst: L<<T extends P>(v: T) => L<(_: unknown) => T>> |
export const cnst: L<<T extends L>(v: T) => L<(_: unknown) => T>> |
||||||
= _(v => _(_ => v)) as L<<T extends P>(v: T) => L<(_: unknown) => T>>; |
= _(v => _(_ => v)) as L<<T extends L>(v: T) => L<(_: unknown) => T>>; |
||||||
export const pipe: L<<A extends P, B extends P, C extends P>(f: L<(v: B) => C>) => L<(g: L<(v: A) => B>) => L<(v: A) => C>>> |
export const pipe: L<<A extends L, B extends L, C extends L>(f: L<(v: B) => C>) => L<(g: L<(v: A) => B>) => L<(v: A) => C>>> |
||||||
= _(<A extends P, B extends P, C extends P>(f: L<(v: B) => C>) => |
= _(<A extends L, B extends L, C extends L>(f: L<(v: B) => C>) => |
||||||
_((g: L<(v: A) => B>) => |
_((g: L<(v: A) => B>) => |
||||||
_((v: A) => f(g(v))))); |
_((v: A) => f(g(v))))); |
||||||
|
|||||||
@ -1,3 +1,7 @@ |
|||||||
import { toNative as $$, _, fromNative as __, id } from './core'; |
import { _, fromNative as __ } from './core'; |
||||||
|
import { toString as $s, fromString as _s } from './string'; |
||||||
|
import { run } from './bf'; |
||||||
|
|
||||||
console.log($$(id(__('first')))); |
console.log($s(run |
||||||
|
(_s('++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.')) |
||||||
|
(_s('')))); |
||||||
|
|||||||
@ -1,82 +1,82 @@ |
|||||||
import { L, P, _ } from './core'; |
import { L, _ } from './core'; |
||||||
import { GT, LT, Ord } from './ord'; |
import { GT, LT, Ord } from './ord'; |
||||||
import { Bool, False, True, and } from './bool'; |
import { Bool, False, True, and } from './bool'; |
||||||
import { Nil, concat, cons } from './list'; |
import { Nil, concat, cons } from './list'; |
||||||
import { String, fromString as _s } from './string'; |
import { String, fromString as _s } from './string'; |
||||||
|
|
||||||
export type Pair<F extends P, S extends P> = L<<R extends P>(f: L<(f: F) => L<(s: S) => R>>) => R>; |
export type Pair<F extends L, S extends L> = L<<R extends L>(f: L<(f: F) => L<(s: S) => R>>) => R>; |
||||||
|
|
||||||
export const Pair: L<<F extends P, S extends P>(f: F) => L<(s: S) => Pair<F, S>>> |
export const Pair: L<<F extends L, S extends L>(f: F) => L<(s: S) => Pair<F, S>>> |
||||||
= _(<F extends P, S extends P>(f: F) => |
= _(<F extends L, S extends L>(f: F) => |
||||||
_((s: S) => |
_((s: S) => |
||||||
_(<R extends P>(p: L<(f: F) => L<(s: S) => R>>) => p(f)(s)))); |
_(<R extends L>(p: L<(f: F) => L<(s: S) => R>>) => p(f)(s)))); |
||||||
|
|
||||||
export const fst: L<<F extends P, S extends P>(p: Pair<F, S>) => F> |
export const fst: L<<F extends L, S extends L>(p: Pair<F, S>) => F> |
||||||
= _(p => p(_(f => _(_s => f)))); |
= _(p => p(_(f => _(_s => f)))); |
||||||
|
|
||||||
export const snd: L<<F extends P, S extends P>(p: Pair<F, S>) => S> |
export const snd: L<<F extends L, S extends L>(p: Pair<F, S>) => S> |
||||||
= _(p => p(_(_f => _(s => s)))); |
= _(p => p(_(_f => _(s => s)))); |
||||||
|
|
||||||
export const first: L<<F extends P, FR extends P, S extends P>(t: L<(f: F) => FR>) => L<(p: Pair<F, S>) => Pair<FR, S>>> |
export const first: L<<F extends L, FR extends L, S extends L>(t: L<(f: F) => FR>) => L<(p: Pair<F, S>) => Pair<FR, S>>> |
||||||
= _(<F extends P, FR extends P>(t: L<(f: F) => FR>) => |
= _(<F extends L, FR extends L>(t: L<(f: F) => FR>) => |
||||||
_(<S extends P>(p: Pair<F, S>) => p(_(f => _(s => Pair(t(f))(s)))))); |
_(<S extends L>(p: Pair<F, S>) => p(_(f => _(s => Pair(t(f))(s)))))); |
||||||
|
|
||||||
export const second: L<<F extends P, S extends P, SR extends P>(t: L<(s: S) => SR>) => L<(p: Pair<F, S>) => Pair<F, SR>>> |
export const second: L<<F extends L, S extends L, SR extends L>(t: L<(s: S) => SR>) => L<(p: Pair<F, S>) => Pair<F, SR>>> |
||||||
= _(<S extends P, SR extends P>(t: L<(s: S) => SR>) => |
= _(<S extends L, SR extends L>(t: L<(s: S) => SR>) => |
||||||
_(<F extends P>(p: Pair<F, S>) => p(_(f => _(s => Pair(f)(t(s))))))); |
_(<F extends L>(p: Pair<F, S>) => p(_(f => _(s => Pair(f)(t(s))))))); |
||||||
|
|
||||||
export const both: L<<F extends P, FR extends P, S extends P, SR extends P>(tf: L<(f: F) => FR>) => L<(ts: L<(s: S) => SR>) => L<(p: Pair<F, S>) => Pair<FR, SR>>>> |
export const both: L<<F extends L, FR extends L, S extends L, SR extends L>(tf: L<(f: F) => FR>) => L<(ts: L<(s: S) => SR>) => L<(p: Pair<F, S>) => Pair<FR, SR>>>> |
||||||
= _(<F extends P, FR extends P>(tf: L<(f: F) => FR>) => |
= _(<F extends L, FR extends L>(tf: L<(f: F) => FR>) => |
||||||
_(<S extends P, SR extends P>(ts: L<(s: S) => SR>) => |
_(<S extends L, SR extends L>(ts: L<(s: S) => SR>) => |
||||||
_((p: Pair<F, S>) => p(_(f => _(s => Pair(tf(f))(ts(s)))))))); |
_((p: Pair<F, S>) => p(_(f => _(s => Pair(tf(f))(ts(s)))))))); |
||||||
|
|
||||||
export const uncurry: L<<F extends P, S extends P, R extends P>(t: L<(f: F) => L<(s: S) => R>>) => L<(p: Pair<F, S>) => R>> |
export const uncurry: L<<F extends L, S extends L, R extends L>(t: L<(f: F) => L<(s: S) => R>>) => L<(p: Pair<F, S>) => R>> |
||||||
= _(<F extends P, S extends P, R extends P>(t: L<(f: F) => L<(s: S) => R>>) => |
= _(<F extends L, S extends L, R extends L>(t: L<(f: F) => L<(s: S) => R>>) => |
||||||
_((p: Pair<F, S>) => p(t))); |
_((p: Pair<F, S>) => p(t))); |
||||||
|
|
||||||
export const cmp: L<<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Ord>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Ord>>>> |
export const cmp: L<<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Ord>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Ord>>>> |
||||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
= _(<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||||
uncurry(_((lf: F) => _((ls: S) => |
uncurry(_((lf: F) => _((ls: S) => |
||||||
uncurry(_((rf: F) => _((rs: S) => |
uncurry(_((rf: F) => _((rs: S) => |
||||||
fcmp(lf)(rf)(LT)(scmp(ls)(rs))(GT))))))))); |
fcmp(lf)(rf)(LT)(scmp(ls)(rs))(GT))))))))); |
||||||
|
|
||||||
export const lt: L<<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
export const lt: L<<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
||||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
= _(<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||||
uncurry(_((lf: F) => _((ls: S) => |
uncurry(_((lf: F) => _((ls: S) => |
||||||
uncurry(_((rf: F) => _((rs: S) => |
uncurry(_((rf: F) => _((rs: S) => |
||||||
fcmp(lf)(rf)(True)(scmp(ls)(rs)(True)(False)(False))(False))))))))); |
fcmp(lf)(rf)(True)(scmp(ls)(rs)(True)(False)(False))(False))))))))); |
||||||
|
|
||||||
export const le: L<<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
export const le: L<<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
||||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
= _(<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||||
uncurry(_((lf: F) => _((ls: S) => |
uncurry(_((lf: F) => _((ls: S) => |
||||||
uncurry(_((rf: F) => _((rs: S) => |
uncurry(_((rf: F) => _((rs: S) => |
||||||
fcmp(lf)(rf)(True)(scmp(ls)(rs)(True)(True)(False))(False))))))))); |
fcmp(lf)(rf)(True)(scmp(ls)(rs)(True)(True)(False))(False))))))))); |
||||||
|
|
||||||
export const eq: L<<F extends P, S extends P>(feq: L<(l: F) => L<(r: F) => Bool>>) => L<(seq: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
export const eq: L<<F extends L, S extends L>(feq: L<(l: F) => L<(r: F) => Bool>>) => L<(seq: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
||||||
= _(<F extends P, S extends P>(feq: L<(l: F) => L<(r: F) => Bool>>) => |
= _(<F extends L, S extends L>(feq: L<(l: F) => L<(r: F) => Bool>>) => |
||||||
_((seq: L<(l: S) => L<(r: S) => Bool>>) => |
_((seq: L<(l: S) => L<(r: S) => Bool>>) => |
||||||
uncurry(_((lf: F) => _((ls: S) => |
uncurry(_((lf: F) => _((ls: S) => |
||||||
uncurry(_((rf: F) => _((rs: S) => |
uncurry(_((rf: F) => _((rs: S) => |
||||||
and(feq(lf)(rf))(seq(ls)(rs)))))))))); |
and(feq(lf)(rf))(seq(ls)(rs)))))))))); |
||||||
|
|
||||||
export const ge: L<<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
export const ge: L<<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
||||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
= _(<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||||
uncurry(_((lf: F) => _((ls: S) => |
uncurry(_((lf: F) => _((ls: S) => |
||||||
uncurry(_((rf: F) => _((rs: S) => |
uncurry(_((rf: F) => _((rs: S) => |
||||||
fcmp(lf)(rf)(False)(scmp(ls)(rs)(False)(True)(True))(True))))))))); |
fcmp(lf)(rf)(False)(scmp(ls)(rs)(False)(True)(True))(True))))))))); |
||||||
|
|
||||||
export const gt: L<<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
export const gt: L<<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => L<(scmp: L<(l: S) => L<(r: S) => Bool>>) => L<(l: Pair<F, S>) => L<(r: Pair<F, S>) => Bool>>>> |
||||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
= _(<F extends L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||||
uncurry(_((lf: F) => _((ls: S) => |
uncurry(_((lf: F) => _((ls: S) => |
||||||
uncurry(_((rf: F) => _((rs: S) => |
uncurry(_((rf: F) => _((rs: S) => |
||||||
fcmp(lf)(rf)(False)(scmp(ls)(rs)(False)(False)(True))(True))))))))); |
fcmp(lf)(rf)(False)(scmp(ls)(rs)(False)(False)(True))(True))))))))); |
||||||
|
|
||||||
export const show: L<<F extends P, S extends P>(fshow: L<(f: F) => String>) => L<(sshow: L<(s: S) => String>) => L<(p: Pair<F, S>) => String>>> |
export const show: L<<F extends L, S extends L>(fshow: L<(f: F) => String>) => L<(sshow: L<(s: S) => String>) => L<(p: Pair<F, S>) => String>>> |
||||||
= _(<F extends P>(fshow: L<(f: F) => String>) => |
= _(<F extends L>(fshow: L<(f: F) => String>) => |
||||||
_(<S extends P>(sshow: L<(s: S) => String>) => |
_(<S extends L>(sshow: L<(s: S) => String>) => |
||||||
uncurry(_((f: F) => _((s: S) => concat(cons(_s('('))(cons(fshow(f))(cons(_s(', '))(cons(sshow(s))(cons(_s(')'))(Nil))))))))))); |
uncurry(_((f: F) => _((s: S) => concat(cons(_s('('))(cons(fshow(f))(cons(_s(', '))(cons(sshow(s))(cons(_s(')'))(Nil))))))))))); |
||||||
|
|||||||
Loading…
Reference in new issue