js:add lib and .d.ts

This commit is contained in:
pengfei.zhou
2020-01-03 14:44:51 +08:00
committed by osborn
parent 624e90e4a8
commit 7cde16a75d
84 changed files with 3794 additions and 19 deletions

8
doric-js/lib/src/pattern/candies.d.ts vendored Normal file
View File

@@ -0,0 +1,8 @@
export declare function take<T>(target: T): (block: (p: T) => void) => void;
export declare function takeNonNull<T, R>(target?: T): (block: (p: T) => R) => R | undefined;
export declare function takeNull<T, R>(target?: T): (block: () => R) => R | undefined;
export declare function takeLet<T, R>(target: T): (block: (p: T) => R | undefined) => R | undefined;
export declare function takeAlso<T>(target: T): (block: (p: T) => void) => T;
export declare function takeIf<T>(target: T): (predicate: (t: T) => boolean) => T | undefined;
export declare function takeUnless<T>(target: T): (predicate: (t: T) => boolean) => T | undefined;
export declare function repeat(action: (count: number) => void): (times: number) => void;

View File

@@ -0,0 +1,62 @@
/*
* Copyright [2019] [Doric.Pub]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export function take(target) {
return (block) => {
block(target);
};
}
export function takeNonNull(target) {
return (block) => {
if (target !== undefined) {
return block(target);
}
};
}
export function takeNull(target) {
return (block) => {
if (target === undefined) {
return block();
}
};
}
export function takeLet(target) {
return (block) => {
return block(target);
};
}
export function takeAlso(target) {
return (block) => {
block(target);
return target;
};
}
export function takeIf(target) {
return (predicate) => {
return predicate(target) ? target : undefined;
};
}
export function takeUnless(target) {
return (predicate) => {
return predicate(target) ? undefined : target;
};
}
export function repeat(action) {
return (times) => {
for (let i = 0; i < times; i++) {
action(i);
}
};
}

View File

@@ -0,0 +1,3 @@
export * from './candies';
export * from './provider';
export * from './mvvm';

View File

@@ -0,0 +1,18 @@
/*
* Copyright [2019] [Doric.Pub]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export * from './candies';
export * from './provider';
export * from './mvvm';

27
doric-js/lib/src/pattern/mvvm.d.ts vendored Normal file
View File

@@ -0,0 +1,27 @@
import { Group } from "../ui/view";
import { Panel } from "../ui/panel";
export declare abstract class ViewHolder {
abstract build(root: Group): void;
}
export declare type Setter<M> = (state: M) => void;
export declare abstract class ViewModel<M extends Object, V extends ViewHolder> {
private state;
private viewHolder;
constructor(obj: M, v: V);
getState(): M;
updateState(setter: Setter<M>): void;
attach(view: Group): void;
abstract onAttached(state: M, vh: V): void;
abstract onBind(state: M, vh: V): void;
}
export declare type ViewModelClass<M, V extends ViewHolder> = new (m: M, v: V) => ViewModel<M, V>;
export declare type ViewHolderClass<V> = new () => V;
export declare abstract class VMPanel<M extends Object, V extends ViewHolder> extends Panel {
private vm?;
private vh?;
abstract getViewModelClass(): ViewModelClass<M, V>;
abstract getState(): M;
abstract getViewHolderClass(): ViewHolderClass<V>;
getViewModel(): ViewModel<M, V> | undefined;
build(root: Group): void;
}

View File

@@ -0,0 +1,31 @@
import { Panel } from "../ui/panel";
export class ViewHolder {
}
export class ViewModel {
constructor(obj, v) {
this.state = obj;
this.viewHolder = v;
}
getState() {
return this.state;
}
updateState(setter) {
setter(this.state);
this.onBind(this.state, this.viewHolder);
}
attach(view) {
this.viewHolder.build(view);
this.onAttached(this.state, this.viewHolder);
this.onBind(this.state, this.viewHolder);
}
}
export class VMPanel extends Panel {
getViewModel() {
return this.vm;
}
build(root) {
this.vh = new (this.getViewHolderClass());
this.vm = new (this.getViewModelClass())(this.getState(), this.vh);
this.vm.attach(root);
}
}

42
doric-js/lib/src/pattern/provider.d.ts vendored Normal file
View File

@@ -0,0 +1,42 @@
export declare type Observer<T> = (v: T) => void;
export declare type Updater<T> = (v: T) => T;
export interface IObservable<T> {
addObserver(observer: Observer<T | undefined>): void;
removeObserver(observer: Observer<T | undefined>): void;
update(updater: Updater<T | undefined>): void;
}
export declare class Observable<M> implements IObservable<M> {
private provider;
private clz;
private observers;
constructor(provider: IProvider, clz: {
new (...args: any[]): M;
});
addObserver(observer: Observer<M | undefined>): void;
removeObserver(observer: Observer<M | undefined>): void;
update(updater: Updater<M | undefined>): void;
}
export interface IProvider {
provide(obj: Object): void;
acquire<T>(clz: {
new (...args: any[]): T;
}): T | undefined;
remove<T>(clz: {
new (...args: any[]): T;
}): void;
clear(): void;
observe<T>(clz: {
new (...args: any[]): T;
}): Observable<T>;
}
export declare class Provider implements IProvider {
private provision;
private observableMap;
provide(obj: Object): void;
acquire<T>(clz: {
new (...args: any[]): T;
}): T | undefined;
remove<T>(clz: new (...args: any[]) => T): void;
clear(): void;
observe<T>(clz: new (...args: any[]) => T): Observable<T>;
}

View File

@@ -0,0 +1,50 @@
export class Observable {
constructor(provider, clz) {
this.observers = new Set;
this.provider = provider;
this.clz = clz;
}
addObserver(observer) {
this.observers.add(observer);
}
removeObserver(observer) {
this.observers.delete(observer);
}
update(updater) {
const oldV = this.provider.acquire(this.clz);
const newV = updater(oldV);
if (newV !== undefined) {
this.provider.provide(newV);
}
for (let observer of this.observers) {
observer(newV);
}
}
}
export class Provider {
constructor() {
this.provision = new Map;
this.observableMap = new Map;
}
provide(obj) {
this.provision.set(obj.constructor, obj);
}
acquire(clz) {
const ret = this.provision.get(clz);
return ret;
}
remove(clz) {
this.provision.delete(clz);
}
clear() {
this.provision.clear();
}
observe(clz) {
let observable = this.observableMap.get(clz);
if (observable === undefined) {
observable = new Observable(this, clz);
this.observableMap.set(clz, observable);
}
return observable;
}
}