List indexing
This commit is contained in:
+15
@@ -1,6 +1,7 @@
|
||||
import { toNative as $$, L, P, _, fromNative as __, undef } from './core';
|
||||
import { EQ, GT, LT, Ord, eq as eqc } from './ord';
|
||||
import { Bool, False, True, and, iif, or } from './bool';
|
||||
import { Num } from 'src/num';
|
||||
|
||||
export type List<T extends P> = L<<R extends P>(z: R) => L<(f: L<(x: T) => L<(xs: List<T>) => R>>) => R>>;
|
||||
|
||||
@@ -99,6 +100,20 @@ export const all: L<<T extends P>(f: L<(x: T) => Bool>) => L<(xs: List<T>) => Bo
|
||||
= _(<T extends P>(f: L<(x: T) => Bool>) =>
|
||||
_((xs: List<T>) => xs._(True)._(_(x => _(xs => and._(f._(x))._(all._(f)._(xs)))))));
|
||||
|
||||
export const get: L<<T extends P>(i: Num) => L<(xs: List<T>) => T>>
|
||||
= _(<T extends P>(i: Num) =>
|
||||
_((xs: List<T>) =>
|
||||
xs._(undef)._(_((x: T) => _((xs: List<T>) => i._(x)._(_(pi => get._<T>(pi)._(xs))))))));
|
||||
|
||||
export const update: L<<T extends P>(f: L< (p: T) => T>) => L<(i: Num) => L<(xs: List<T>) => List<T>>>>
|
||||
= _(<T extends P>(f: L< (p: T) => T>) =>
|
||||
_((i: Num) =>
|
||||
_((xs: List<T>) =>
|
||||
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>>>>
|
||||
= _(<T extends P>(v: T) => update._<T>(_(_ => v)));
|
||||
|
||||
export const fromArray: <T extends P>(xs: T[]) => List<T>
|
||||
= xs => xs.length === 0 ? Nil : Cons._(xs[0])._(new L(() => fromArray(xs.slice(1)).value));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user