Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 14 additions & 28 deletions extra.mjs
Original file line number Diff line number Diff line change
@@ -1,33 +1,23 @@
import reactive from "./reactive.mjs"
import readable from "./readable.mjs"
import observe from "./observe.mjs"
import {
Observer,
iObserver
} from "./observer.mjs"
import {
fullpipe
} from "./utils.mjs"

import {
constant,
pipe,
isUndefined,
noop
} from "./operation.mjs"
import {
injectProperties
} from "./tools.mjs"
import {
DomPrinter
} from "./dom.mjs"


/**
* Base class for controllers, models and Views
*/
export class EventBroker {
constructor(){
observe.call(this)
}
}

/**
* it handle the data logic of the app
* it takes an array of names that will be
Expand All @@ -38,14 +28,13 @@ export class EventBroker {
*/

export function Model(self, ...props){
class Model extends self {
class Model extends iObserver(self) {
constructor(...args){
super(...args)
initModel.apply(this, props)
}
}
reactive.call(Model.prototype)
observe.call(Model.prototype)
return Model;
}

Expand All @@ -62,11 +51,10 @@ function initModel(...props){
* @param {function} render
*/

export class ViewBase extends EventBroker {}

injectProperties.call(ViewBase.prototype, {
print: new DomPrinter()
})
export class ViewBase extends Observer {
print = new DomPrinter()
render(){}
}

export function View(render = constant("")) {
class View extends ViewBase {
Expand All @@ -83,7 +71,7 @@ export function View(render = constant("")) {
* calling the method trigger
*/
const HANDLERS = Symbol('handlers');
export class Router extends EventBroker {
export class Router extends Observer {
constructor(method = "reduce", handler = reducer) {
super()
this[HANDLERS] = [];
Expand Down Expand Up @@ -147,13 +135,11 @@ class Handler {
*/
const REGISTERED = Symbol('registered')
const TRIGGER = Symbol("trigger")
export class Controller extends EventBroker {
export class Controller extends Observer {
[REGISTERED] = {}
constructor(init = {}, trigger = pipe){
super()
Object.assign(
this[REGISTERED] = {},
init
)
this[REGISTERED] = init
this[TRIGGER] = trigger;
}

Expand Down Expand Up @@ -196,7 +182,7 @@ function getter(self, p) {
* @param {function} handler
*/

export class Gateway extends EventBroker {
export class Gateway extends Observer {
constructor(handler = fullpipe){
super()
this[HANDLER] = handler
Expand Down
16 changes: 16 additions & 0 deletions framework.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { iObserver } from "./observer.mjs"

export class Base extends iObserver(class {
constructor() {
assign.apply(this, arguments)
}
}){}

export function assign(...args){
const proto = this.constructor.prototype
Object.assign(this, ...args)
if(proto !== Object.getPrototypeOf(this)) {
throw new TypeError("override __proto__")
}
return this
}
20 changes: 15 additions & 5 deletions observe.mjs → observer.mjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Observable interface
* observer interface
* @module
* @see module:tools
*/
Expand All @@ -22,7 +22,7 @@ export const OBSERVERS = Symbol("observers")

/**
* Interface definition
* @interface observable
* @interface observer
*/
const HANDLERS = {
on,
Expand All @@ -34,12 +34,22 @@ const HANDLERS = {

/**
* Interface definition
* @lends observable
* @lends observer
*/
export function observable() {
export function observer() {
return injectProperties.call(this, HANDLERS)
}
export default observable

export default observer

export function iObserver(self = Object) {
class Observer extends self {}
observer.call(Observer.prototype)
return Observer
}

export const Observer = iObserver()


/**
* Builds the event list if not exist
Expand Down
9 changes: 9 additions & 0 deletions reactive.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ export default function reactive() {
return injectProperties.call(this, HANDLERS)
}

export function iReactive(self = Object) {
class Reactive extends self {}
reactive.call(Reactive.prototype)
return Reactive
}

export const Reactive = iReactive()


function buildBinder (list, build, val) {
var recurring = 0
const setter = (v) => {
Expand Down
8 changes: 8 additions & 0 deletions readable.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ export default function readable(
return injectProperties.call(this, opt)
}

export function iReadable(self = Object) {
class Readable extends self {}
readable.call(Readable.prototype)
return Readable
}

export const Readable = iReadable()

function broadcast(){
this[BUFFER] = arguments
flush.apply(this, arguments)
Expand Down
19 changes: 10 additions & 9 deletions test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* @module
* @see module:tools
* @see module:reactive
* @see module:observe
* @see module:observer
*/

import {
Expand All @@ -17,9 +17,13 @@ import {
ASSERT_T,
} from "./debug.mjs"

import observable from "./observe.mjs"
import {
Base
} from "./framework.mjs"

import reactive from "./reactive.mjs"
import {
iReactive
} from "./reactive.mjs"

DEBUG(true)

Expand All @@ -30,12 +34,12 @@ export const states = {
PASSED: "PASSED"
}

export class Test {
constructor(description, test = pipe, ...opt) {
export class Test extends iReactive(Base) {
constructor(description, test = pipe) {
good(description, String)
good(test, Function)
super()
this.id = ++COUNTER
this.options = opt;
this.description = description;
this.test = test;
this.bindable("result")
Expand Down Expand Up @@ -70,9 +74,6 @@ export class Test {

Test.prototype.print = consolePrinter;

observable.call(Test.prototype)
reactive.call(Test.prototype)

export default Test;

async function resolver(args, ok, ko, resolve) {
Expand Down
29 changes: 17 additions & 12 deletions tests/run.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import readable from "../readable.mjs";
import reactive from "../reactive.mjs";
import * as extra from "../extra.mjs";
import {
random,
Observer
} from "../observer.mjs";
import {
delay,
RegObj,
debounce,
Expand All @@ -23,8 +25,7 @@ import {
ASSERT_T,
} from "../debug.mjs";
import {
View,
EventBroker
View
} from "../extra.mjs";

const isBrowser = typeof Document != 'undefined' && document.body
Expand Down Expand Up @@ -286,28 +287,32 @@ export async function testExtra() {
export async function testRegObj() {
return await new Test("reg obj", async () =>{
ASSERT_T("foobar!".match(new RegObj(/\w+(bar\!)/, "baz")).baz == "bar!")
})
}).run()
}


export async function testEventBroker() {
return await new Test("event broker", async () =>{
var evt = new EventBroker()
var x = 0
export async function testObserver() {
return await new Test("event broker", async (x = 0) =>{
var evt = new Observer()
var handler = () => ++x
evt.on('one', handler)
evt.on('two', handler)
evt.on('three', handler)

await delay(100)
evt.fireLast('one')
evt.fireLast('two')
evt.fireLast('three')

await delay(100)

ASSERT_T(x == 1)
})
var evt = new class extends Observer {}, y
evt.on('e', x => (y = x))
evt.fire('e', x)
ASSERT_T(x == y)
return x
}).run()
}

export async function testDebounce() {
Expand Down