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> { |
||||
const r: T = ((p: Parameters<T>[0]) => { |
||||
let v: any; |
||||
return ___(() => run()( |
||||
___(() => v ??= p.run()), |
||||
).run()); |
||||
}) as T; |
||||
export type L<T extends F = F> = T & { run: () => 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 type P = L<(v: unknown) => L<any>>; |
||||
|
||||
export const _ = <T extends ((v: unknown) => L<any>)>(v: T): L<T> => ___(() => v); |
||||
export const _ = <T extends F>(v: T): L<T> => defer(() => v); |
||||
|
||||
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 |
||||
= <T>(v: L<any>) => v.run() as T; |
||||
|
||||
export const undef: any = ___(() => { |
||||
throw new Error('undefined'); |
||||
}); |
||||
export const y = (f: () => L<F>) => defer(() => f().run()); |
||||
|
||||
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); |
||||
export const cnst: L<<T extends P>(v: T) => L<(_: unknown) => T>> |
||||
= _(v => _(_ => v)) as L<<T extends P>(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>>> |
||||
= _(<A extends P, B extends P, C extends P>(f: L<(v: B) => C>) => |
||||
export const cnst: L<<T extends L>(v: T) => L<(_: unknown) => T>> |
||||
= _(v => _(_ => v)) as L<<T extends L>(v: T) => L<(_: unknown) => T>>; |
||||
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 L, B extends L, C extends L>(f: L<(v: B) => C>) => |
||||
_((g: L<(v: A) => B>) => |
||||
_((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 { Bool, False, True, and } from './bool'; |
||||
import { Nil, concat, cons } from './list'; |
||||
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>>> |
||||
= _(<F extends P, S extends P>(f: F) => |
||||
export const Pair: L<<F extends L, S extends L>(f: F) => L<(s: S) => Pair<F, S>>> |
||||
= _(<F extends L, S extends L>(f: F) => |
||||
_((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)))); |
||||
|
||||
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)))); |
||||
|
||||
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>>> |
||||
= _(<F extends P, FR extends P>(t: L<(f: F) => FR>) => |
||||
_(<S extends P>(p: Pair<F, S>) => p(_(f => _(s => Pair(t(f))(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 L, FR extends L>(t: L<(f: F) => FR>) => |
||||
_(<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>>> |
||||
= _(<S extends P, SR extends P>(t: L<(s: S) => SR>) => |
||||
_(<F extends P>(p: Pair<F, S>) => p(_(f => _(s => Pair(f)(t(s))))))); |
||||
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 L, SR extends L>(t: L<(s: S) => SR>) => |
||||
_(<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>>>> |
||||
= _(<F extends P, FR extends P>(tf: L<(f: F) => FR>) => |
||||
_(<S extends P, SR extends P>(ts: L<(s: S) => 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 L, FR extends L>(tf: L<(f: F) => FR>) => |
||||
_(<S extends L, SR extends L>(ts: L<(s: S) => SR>) => |
||||
_((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>> |
||||
= _(<F extends P, S extends P, R extends P>(t: L<(f: F) => L<(s: 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 L, S extends L, R extends L>(t: L<(f: F) => L<(s: S) => R>>) => |
||||
_((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>>>> |
||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => 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 L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||
uncurry(_((lf: F) => _((ls: S) => |
||||
uncurry(_((rf: F) => _((rs: S) => |
||||
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>>>> |
||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||
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 L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||
uncurry(_((lf: F) => _((ls: S) => |
||||
uncurry(_((rf: F) => _((rs: S) => |
||||
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>>>> |
||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||
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 L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||
uncurry(_((lf: F) => _((ls: S) => |
||||
uncurry(_((rf: F) => _((rs: S) => |
||||
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>>>> |
||||
= _(<F extends P, S extends P>(feq: L<(l: F) => L<(r: F) => 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 L, S extends L>(feq: L<(l: F) => L<(r: F) => Bool>>) => |
||||
_((seq: L<(l: S) => L<(r: S) => Bool>>) => |
||||
uncurry(_((lf: F) => _((ls: S) => |
||||
uncurry(_((rf: F) => _((rs: S) => |
||||
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>>>> |
||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||
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 L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||
uncurry(_((lf: F) => _((ls: S) => |
||||
uncurry(_((rf: F) => _((rs: S) => |
||||
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>>>> |
||||
= _(<F extends P, S extends P>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||
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 L, S extends L>(fcmp: L<(l: F) => L<(r: F) => Ord>>) => |
||||
_((scmp: L<(l: S) => L<(r: S) => Ord>>) => |
||||
uncurry(_((lf: F) => _((ls: S) => |
||||
uncurry(_((rf: F) => _((rs: S) => |
||||
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>>> |
||||
= _(<F extends P>(fshow: L<(f: F) => String>) => |
||||
_(<S extends P>(sshow: L<(s: 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 L>(fshow: L<(f: F) => 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))))))))))); |
||||
|
||||
Loading…
Reference in new issue