js:add lib and .d.ts
This commit is contained in:
8
doric-js/lib/src/pattern/candies.d.ts
vendored
Normal file
8
doric-js/lib/src/pattern/candies.d.ts
vendored
Normal 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;
|
62
doric-js/lib/src/pattern/candies.js
Normal file
62
doric-js/lib/src/pattern/candies.js
Normal 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);
|
||||
}
|
||||
};
|
||||
}
|
3
doric-js/lib/src/pattern/index.pattern.d.ts
vendored
Normal file
3
doric-js/lib/src/pattern/index.pattern.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export * from './candies';
|
||||
export * from './provider';
|
||||
export * from './mvvm';
|
18
doric-js/lib/src/pattern/index.pattern.js
Normal file
18
doric-js/lib/src/pattern/index.pattern.js
Normal 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
27
doric-js/lib/src/pattern/mvvm.d.ts
vendored
Normal 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;
|
||||
}
|
31
doric-js/lib/src/pattern/mvvm.js
Normal file
31
doric-js/lib/src/pattern/mvvm.js
Normal 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
42
doric-js/lib/src/pattern/provider.d.ts
vendored
Normal 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>;
|
||||
}
|
50
doric-js/lib/src/pattern/provider.js
Normal file
50
doric-js/lib/src/pattern/provider.js
Normal 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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user