Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
smalluban committed Nov 12, 2019
1 parent cd7d76e commit 957173c
Show file tree
Hide file tree
Showing 8 changed files with 546 additions and 9 deletions.
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -8,7 +8,7 @@
"author": "Dominik Lubański <dominik.lubanski@gmail.com>",
"repository": "https://github.com/hybridsjs/hybrids",
"scripts": {
"dev": "karma start",
"dev": "karma start --browsers ChromeHeadless",
"dev:coverage": "rm -rf ./coverage && NODE_ENV=coverage npm run dev",
"test": "karma start --single-run",
"test:coverage": "rm -rf ./coverage && NODE_ENV=coverage npm run test -- --browsers ChromeHeadless",
Expand Down
29 changes: 25 additions & 4 deletions src/cache.js
@@ -1,7 +1,7 @@
import { stringifyElement } from './utils';
import * as emitter from './emitter';

const entries = new WeakMap();
export const entries = new WeakMap();
export function getEntry(target, key) {
let targetMap = entries.get(target);
if (!targetMap) {
Expand All @@ -28,6 +28,15 @@ export function getEntry(target, key) {
return entry;
}

export function getEntries(target) {
const result = [];
const targetMap = entries.get(target);
if (targetMap) {
targetMap.forEach((entry) => { result.push(entry); });
}
return result;
}

function calculateChecksum(entry) {
let checksum = entry.state;
if (entry.deps) {
Expand Down Expand Up @@ -100,8 +109,8 @@ export function get(target, key, getter) {
return entry.value;
}

export function set(target, key, setter, value) {
if (context) {
export function set(target, key, setter, value, force) {
if (context && !force) {
context = null;
throw Error(`Try to set '${key}' of '${stringifyElement(target)}' in get call`);
}
Expand All @@ -110,6 +119,7 @@ export function set(target, key, setter, value) {
const newValue = setter(target, value, entry.value);

if (newValue !== entry.value) {
entry.checksum = 0;
entry.state += 1;
entry.value = newValue;

Expand All @@ -136,5 +146,16 @@ export function invalidate(target, key, clearValue) {
export function observe(target, key, fn) {
const entry = getEntry(target, key);
entry.observed = true;
return emitter.subscribe(entry, fn);
const unsubscribe = emitter.subscribe(entry, fn);

return function unobserve() {
if (unsubscribe()) {
entry.observed = false;
if (entry.deps && entry.deps.size) {
entry.deps.forEach((depEntry) => {
depEntry.contexts.delete(entry);
});
}
}
};
}
5 changes: 4 additions & 1 deletion src/emitter.js
Expand Up @@ -41,5 +41,8 @@ export function subscribe(target, cb) {
listeners.add(cb);
dispatch(target);

return () => listeners.delete(cb);
return function unsubscribe() {
listeners.delete(cb);
return !listeners.size;
};
}
1 change: 1 addition & 0 deletions src/index.js
Expand Up @@ -3,6 +3,7 @@ export { default as property } from './property';
export { default as parent } from './parent';
export { default as children } from './children';
export { default as render } from './render';
export { default as store } from './store';

export { dispatch } from './utils';

Expand Down

0 comments on commit 957173c

Please sign in to comment.