|
|
|
@ -1,4 +1,4 @@ |
|
|
|
import { toNative as $$, L, P, _, fromNative as __, ___, cnst, id, undef } from './core'; |
|
|
|
import { toNative as $$, L, P, _, fromNative as __, ___, cnst, id, pipe, undef } from './core'; |
|
|
|
import { EQ, GT, LT, Ord, eq as eqc } from './ord'; |
|
|
|
import { EQ, GT, LT, Ord, eq as eqc } from './ord'; |
|
|
|
import { Bool, False, True, and, iif, or } from './bool'; |
|
|
|
import { Bool, False, True, and, iif, or } from './bool'; |
|
|
|
import { Num, Zero, succ } from './num'; |
|
|
|
import { Num, Zero, succ } from './num'; |
|
|
|
@ -23,13 +23,16 @@ export const nul: L<<T extends P>(xs: List<T>) => Bool> |
|
|
|
= _(xs => xs(True)(cnst(cnst(False)))); |
|
|
|
= _(xs => xs(True)(cnst(cnst(False)))); |
|
|
|
|
|
|
|
|
|
|
|
export const len: L<<T extends P>(xs: List<T>) => Num> |
|
|
|
export const len: L<<T extends P>(xs: List<T>) => Num> |
|
|
|
= _(xs => xs(Zero)(_(_x => _(xs => succ(len(xs)))))); |
|
|
|
= _(xs => xs(Zero)(cnst(pipe(succ)(len)))); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const singleton: L<<T extends P>(v: T) => List<T>> |
|
|
|
|
|
|
|
= _(x => cons(x)(Nil)); |
|
|
|
|
|
|
|
|
|
|
|
export const append: L<<T extends P>(l: List<T>) => L<(r: List<T>) => List<T>>> |
|
|
|
export const append: L<<T extends P>(l: List<T>) => L<(r: List<T>) => List<T>>> |
|
|
|
= _(l => _(r => l(r)(_(x => _(xs => cons(x)(append(xs)(r))))))); |
|
|
|
= _(l => _(r => l(r)(_(x => _(xs => cons(x)(append(xs)(r))))))); |
|
|
|
|
|
|
|
|
|
|
|
export const concat: L<<T extends P>(ls: List<List<T>>) => List<T>> |
|
|
|
export const concat: L<<T extends P>(ls: List<List<T>>) => List<T>> |
|
|
|
= _(ls => ls(Nil)(_(x => _(xs => append(x)(concat(xs)))))); |
|
|
|
= _(ls => ls(Nil)(_(x => pipe(append(x))(concat)))); |
|
|
|
|
|
|
|
|
|
|
|
export const repeat: L<<T extends P>(x: T) => List<T>> |
|
|
|
export const repeat: L<<T extends P>(x: T) => List<T>> |
|
|
|
= _(x => cons(x)(repeat(x))); |
|
|
|
= _(x => cons(x)(repeat(x))); |
|
|
|
@ -46,7 +49,7 @@ export const tail: L<<T extends P>(xs: List<T>) => List<T>> |
|
|
|
export const foldl: L<<T extends P, R extends P>(f: L<(a: R) => L<(x: T) => R>>) => L<(z: R) => L<(xs: List<T>) => R>>> |
|
|
|
export const foldl: L<<T extends P, R extends P>(f: L<(a: R) => L<(x: T) => R>>) => L<(z: R) => L<(xs: List<T>) => R>>> |
|
|
|
= _(<T extends P, R extends P>(f: L<(a: R) => L<(x: T) => R>>) => |
|
|
|
= _(<T extends P, R extends P>(f: L<(a: R) => L<(x: T) => R>>) => |
|
|
|
_((z: R) => |
|
|
|
_((z: R) => |
|
|
|
_((xs: List<T>) => xs(z)(_(x => foldl(f)(f(z)(x))))))); |
|
|
|
_((xs: List<T>) => xs(z)(pipe(foldl(f))(f(z)))))); |
|
|
|
|
|
|
|
|
|
|
|
export const foldlz: L<<T extends P>(f: L<(a: T) => L<(x: T) => T>>) => L<(xs: List<T>) => T>> |
|
|
|
export const foldlz: L<<T extends P>(f: L<(a: T) => L<(x: T) => T>>) => L<(xs: List<T>) => T>> |
|
|
|
= _(<T extends P>(f: L<(a: T) => L<(x: T) => T>>) => _((xs: List<T>) => xs(undef)(foldl(f)))); |
|
|
|
= _(<T extends P>(f: L<(a: T) => L<(x: T) => T>>) => _((xs: List<T>) => xs(undef)(foldl(f)))); |
|
|
|
@ -54,7 +57,7 @@ export const foldlz: L<<T extends P>(f: L<(a: T) => L<(x: T) => T>>) => L<(xs: L |
|
|
|
export const foldr: L<<T extends P, R extends P>(f: L<(x: T) => L<(a: R) => R>>) => L<(z: R) => L<(xs: List<T>) => R>>> |
|
|
|
export const foldr: L<<T extends P, R extends P>(f: L<(x: T) => L<(a: R) => R>>) => L<(z: R) => L<(xs: List<T>) => R>>> |
|
|
|
= _(<T extends P, R extends P>(f: L<(x: T) => L<(a: R) => R>>) => |
|
|
|
= _(<T extends P, R extends P>(f: L<(x: T) => L<(a: R) => R>>) => |
|
|
|
_((z: R) => |
|
|
|
_((z: R) => |
|
|
|
_((xs: List<T>) => xs(z)(_(x => _(xs => f(x)(foldr(f)(z)(xs)))))))); |
|
|
|
_((xs: List<T>) => xs(z)(_(x => pipe(f(x))(foldr(f)(z))))))); |
|
|
|
|
|
|
|
|
|
|
|
export const foldrz: L<<T extends P>(f: L<(x: T) => L<(a: T) => T>>) => L<(xs: List<T>) => T>> |
|
|
|
export const foldrz: L<<T extends P>(f: L<(x: T) => L<(a: T) => T>>) => L<(xs: List<T>) => T>> |
|
|
|
= undef; |
|
|
|
= undef; |
|
|
|
@ -102,19 +105,19 @@ export const gt: L<<T extends P>(ecmp: L<(l: T) => L <(r: T) => Ord>>) => L<(l: |
|
|
|
|
|
|
|
|
|
|
|
export const map: L<<T extends P, R extends P>(f: L<(x: T) => R>) => L<(xs: List<T>) => List<R>>> |
|
|
|
export const map: L<<T extends P, R extends P>(f: L<(x: T) => R>) => L<(xs: List<T>) => List<R>>> |
|
|
|
= _(<T extends P, R extends P>(f: L<(x: T) => R>) => |
|
|
|
= _(<T extends P, R extends P>(f: L<(x: T) => R>) => |
|
|
|
_((xs: List<T>) => xs(Nil)(_(x => _(xs => cons(f(x))(map(f)(xs))))))); |
|
|
|
_((xs: List<T>) => xs(Nil)(_(x => pipe(cons(f(x)))(map(f)))))); |
|
|
|
|
|
|
|
|
|
|
|
export const filter: L<<T extends P>(f: L<(x: T) => Bool>) => L<(xs: List<T>) => List<T>>> |
|
|
|
export const filter: L<<T extends P>(f: L<(x: T) => Bool>) => L<(xs: List<T>) => List<T>>> |
|
|
|
= _(<T extends P>(f: L<(x: T) => Bool>) => |
|
|
|
= _(<T extends P>(f: L<(x: T) => Bool>) => |
|
|
|
_((xs: List<T>) => xs(Nil)(_(x => _(xs => iif(f(x))(cons(x))(id)(filter(f)(xs))))))); |
|
|
|
_((xs: List<T>) => xs(Nil)(_(x => pipe(iif(f(x))(cons(x))(id))(filter(f)))))); |
|
|
|
|
|
|
|
|
|
|
|
export const any: L<<T extends P>(f: L<(x: T) => Bool>) => L<(xs: List<T>) => Bool>> |
|
|
|
export const any: L<<T extends P>(f: L<(x: T) => Bool>) => L<(xs: List<T>) => Bool>> |
|
|
|
= _(<T extends P>(f: L<(x: T) => Bool>) => |
|
|
|
= _(<T extends P>(f: L<(x: T) => Bool>) => |
|
|
|
_((xs: List<T>) => xs(False)(_(x => _(xs => or(f(x))(any(f)(xs))))))); |
|
|
|
_((xs: List<T>) => xs(False)(_(x => pipe(or(f(x)))(any(f)))))); |
|
|
|
|
|
|
|
|
|
|
|
export const all: L<<T extends P>(f: L<(x: T) => Bool>) => L<(xs: List<T>) => Bool>> |
|
|
|
export const all: L<<T extends P>(f: L<(x: T) => Bool>) => L<(xs: List<T>) => Bool>> |
|
|
|
= _(<T extends P>(f: L<(x: T) => Bool>) => |
|
|
|
= _(<T extends P>(f: L<(x: T) => Bool>) => |
|
|
|
_((xs: List<T>) => xs(True)(_(x => _(xs => and(f(x))(all(f)(xs))))))); |
|
|
|
_((xs: List<T>) => xs(True)(_(x => pipe(and(f(x)))(all(f)))))); |
|
|
|
|
|
|
|
|
|
|
|
export const get: L<<T extends P>(i: Num) => L<(xs: List<T>) => T>> |
|
|
|
export const get: L<<T extends P>(i: Num) => L<(xs: List<T>) => T>> |
|
|
|
= _(i => _(xs => xs(undef)(_(x => i(cnst(x))(get))))); |
|
|
|
= _(i => _(xs => xs(undef)(_(x => i(cnst(x))(get))))); |
|
|
|
@ -126,7 +129,7 @@ export const update: L<<T extends P>(f: L< (p: T) => T>) => L<(i: Num) => L<(xs: |
|
|
|
xs(undef)(_(x => _(xs => i(cons(f(x))(xs))(_(pi => cons(x)(update(f)(pi)(xs)))))))))); |
|
|
|
xs(undef)(_(x => _(xs => i(cons(f(x))(xs))(_(pi => cons(x)(update(f)(pi)(xs)))))))))); |
|
|
|
|
|
|
|
|
|
|
|
export const set: L<<T extends P>(v: T) => L<(i: Num) => L<(xs: List<T>) => List<T>>>> |
|
|
|
export const set: L<<T extends P>(v: T) => L<(i: Num) => L<(xs: List<T>) => List<T>>>> |
|
|
|
= _(v => update(cnst(v))); |
|
|
|
= pipe(update)(cnst); |
|
|
|
|
|
|
|
|
|
|
|
export const intersperse: L<<T extends P>(v: T) => L<(xs: List<T>) => List<T>>> |
|
|
|
export const intersperse: L<<T extends P>(v: T) => L<(xs: List<T>) => List<T>>> |
|
|
|
= _(v => _(xs => xs(xs)(_(x => _(rxs => rxs(xs)(cnst(cnst(cons(x)(cons(v)(intersperse(v)(rxs))))))))))); |
|
|
|
= _(v => _(xs => xs(xs)(_(x => _(rxs => rxs(xs)(cnst(cnst(cons(x)(cons(v)(intersperse(v)(rxs))))))))))); |
|
|
|
|