Structure Updated
This commit is contained in:
parent
dd05b030b7
commit
b6f60c7ade
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@saqut/wirejs",
|
"name": "@saqut/wirejs",
|
||||||
"version": "0.1.0",
|
"version": "0.2.0",
|
||||||
"type": "commonjs",
|
"type": "commonjs",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "Dont use variable, use smart variable wires !",
|
"description": "Dont use variable, use smart variable wires !",
|
||||||
|
|
18
readme.md
18
readme.md
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## Açıklama
|
## Açıklama
|
||||||
|
|
||||||
WiréS, ReactJS kütüphanesinin useState ve useEffect kancalarından ilham alınarak browser ortamı için tekrar yazılmış bir kütüphanedir.
|
WiréS, ReactJS kütüphanesinin useState ve watch kancalarından ilham alınarak browser ortamı için tekrar yazılmış bir kütüphanedir.
|
||||||
Verileri getter/setter fonksiyonlarıyla sararak gerçek değişikleri algılayan özelliği sayesinde gereksiz güncellemeleri göz ardı eder.
|
Verileri getter/setter fonksiyonlarıyla sararak gerçek değişikleri algılayan özelliği sayesinde gereksiz güncellemeleri göz ardı eder.
|
||||||
|
|
||||||
Veri ilişkilerini önceden belirleyerek değişiklik olduğunda okunacak ve yazılacak verileri koşullara bağlayabilir, okuma ve yazma öncesi ara katmanlar ekleyebilirsiniz
|
Veri ilişkilerini önceden belirleyerek değişiklik olduğunda okunacak ve yazılacak verileri koşullara bağlayabilir, okuma ve yazma öncesi ara katmanlar ekleyebilirsiniz
|
||||||
|
@ -36,18 +36,18 @@ currency.get(); // --> 25
|
||||||
|
|
||||||
## Değişimler
|
## Değişimler
|
||||||
|
|
||||||
Bir kablonun değerinin değiştiğini `useEffect` özelliğiyle dinleyebilirsiniz veya birden fazla kablonun değişimini aynı anda dinlemek için `é.useEffect` fonksiyonunu kullanabilirsiniz
|
Bir kablonun değerinin değiştiğini `watch` özelliğiyle dinleyebilirsiniz veya birden fazla kablonun değişimini aynı anda dinlemek için `é.watch` fonksiyonunu kullanabilirsiniz
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
let a = é(0);
|
let a = é(0);
|
||||||
let b = é(0);
|
let b = é(0);
|
||||||
a.useEffect(()=>{
|
a.watch(()=>{
|
||||||
// a kablosu değiştiğinde burası çalışacak
|
// a kablosu değiştiğinde burası çalışacak
|
||||||
})
|
})
|
||||||
b.useEffect(()=>{
|
b.watch(()=>{
|
||||||
// b kablosu değiştiğinde burası çalışacak
|
// b kablosu değiştiğinde burası çalışacak
|
||||||
})
|
})
|
||||||
é.useEffect(()=>{
|
é.watch(()=>{
|
||||||
// a veya b değiştiğinde burası çalışacak
|
// a veya b değiştiğinde burası çalışacak
|
||||||
},[a, b])
|
},[a, b])
|
||||||
```
|
```
|
||||||
|
@ -57,17 +57,17 @@ let toplayan = é(0);
|
||||||
let toplanan = é(0);
|
let toplanan = é(0);
|
||||||
let sonuc = é(0);
|
let sonuc = é(0);
|
||||||
|
|
||||||
é.useEffect(()=>{
|
é.watch(()=>{
|
||||||
sonuc.set( toplayan.get() + toplanan.get() )
|
sonuc.set( toplayan.get() + toplanan.get() )
|
||||||
},[toplayan, toplanan])
|
},[toplayan, toplanan])
|
||||||
|
|
||||||
toplayan.useEffect(()=>{
|
toplayan.watch(()=>{
|
||||||
console.log("Toplayan: ",toplayan.get())
|
console.log("Toplayan: ",toplayan.get())
|
||||||
})
|
})
|
||||||
toplanan.useEffect(()=>{
|
toplanan.watch(()=>{
|
||||||
console.log("Toplanan: ",toplanan.get())
|
console.log("Toplanan: ",toplanan.get())
|
||||||
})
|
})
|
||||||
sonuc.useEffect(()=>{
|
sonuc.watch(()=>{
|
||||||
console.log("Değişen Sonuç: ",sonuc.get())
|
console.log("Değişen Sonuç: ",sonuc.get())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
252
wire.js
252
wire.js
|
@ -1,82 +1,97 @@
|
||||||
|
/*
|
||||||
|
Flags
|
||||||
|
0x01 01 watch enabled
|
||||||
|
0x02 02 read layer enabled
|
||||||
|
0x04 04 write layer enable
|
||||||
|
0x08 08 initial state
|
||||||
|
0x10 16 changing state
|
||||||
|
0x20 32 immediate change
|
||||||
|
*/
|
||||||
|
(()=>{
|
||||||
|
let pipeLine = function(){
|
||||||
|
this.reads = [];
|
||||||
|
this.writes = [];
|
||||||
|
this.read = (fn,pr) => reads.push({fn,pr});
|
||||||
|
this.write = (fn,pr) => writes.push({fn,pr});
|
||||||
|
this.get = (val) => {
|
||||||
|
let fns = reads.sort((a,b) => (a?.pr|0) - (b?.pr|0)),
|
||||||
|
real = val;
|
||||||
|
for (const { fn } of fns) {
|
||||||
|
fn( real, e => real = e );
|
||||||
|
};
|
||||||
|
return real;
|
||||||
|
};
|
||||||
|
this.set = () => {
|
||||||
|
let fns = writes.sort((a,b) => (a?.pr|0) - (b?.pr|0)),
|
||||||
|
real = val;
|
||||||
|
for (const { fn } of fns) {
|
||||||
|
fn( real, e => real = e );
|
||||||
|
};
|
||||||
|
return real;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
pipeLine.prototype.read = function(fn,pr){
|
||||||
|
this.reads.push({fn,pr})
|
||||||
|
}
|
||||||
|
pipeLine.prototype.write = function(fn,pr){
|
||||||
|
this.writes.writes({fn,pr})
|
||||||
|
}
|
||||||
|
pipeLine.prototype.get = function(val){
|
||||||
|
let fns = this.reads.sort((a,b) => (a?.pr|0) - (b?.pr|0)),
|
||||||
|
real = val;
|
||||||
|
for (const { fn } of fns) {
|
||||||
|
fn( real, e => real = e );
|
||||||
|
};
|
||||||
|
return real;
|
||||||
|
}
|
||||||
|
pipeLine.prototype.set = function(val){
|
||||||
|
let fns = this.writes.sort((a,b) => (a?.pr|0) - (b?.pr|0)),
|
||||||
|
real = val;
|
||||||
|
for (const { fn } of fns) {
|
||||||
|
fn( real, e => real = e );
|
||||||
|
};
|
||||||
|
return real;
|
||||||
|
}
|
||||||
function é(defaultValue)
|
function é(defaultValue)
|
||||||
{
|
{
|
||||||
let value = undefined;
|
if(this instanceof é)
|
||||||
let effects = [];
|
|
||||||
let piping = é.pipeLine();
|
|
||||||
let flag = 0;
|
|
||||||
let version = 0;
|
|
||||||
let diff = é.diff;
|
|
||||||
let get = () => {
|
|
||||||
return (flag & 2) ? piping.get(value) : value;
|
|
||||||
};
|
|
||||||
let set = (newValue) => {
|
|
||||||
newValue = é.extract(newValue, value);
|
|
||||||
(flag & 4) && (newValue = piping.set(newValue));
|
|
||||||
if(diff(newValue,value))
|
|
||||||
{
|
{
|
||||||
(flag & 1) && effects.filter(e => e.o).forEach(k => k());
|
this.value = é.extract(defaultValue);
|
||||||
value = newValue;
|
this.version = 0;
|
||||||
version++;
|
this.effects = [];
|
||||||
(flag & 1) && effects.map(e => e.f());
|
this.piping = new pipeLine();
|
||||||
}
|
this.flag = 8;
|
||||||
};
|
}else{
|
||||||
let useEffect = (e) => {
|
return new é(defaultValue)
|
||||||
flag = flag | 1;
|
|
||||||
let k = {
|
|
||||||
f:e,
|
|
||||||
o:undefined
|
|
||||||
};
|
|
||||||
requestAnimationFrame(()=> {
|
|
||||||
k.o = e();
|
|
||||||
})
|
|
||||||
effects.push(k);
|
|
||||||
}
|
|
||||||
value = é.extract(defaultValue, value);
|
|
||||||
return {
|
|
||||||
get,
|
|
||||||
set,
|
|
||||||
useEffect,
|
|
||||||
fp: é.fingerPrint,
|
|
||||||
getVersion: () => version,
|
|
||||||
equalTo: n => é.isSame(n, value),
|
|
||||||
readLayer: (a,b) => {
|
|
||||||
flag = flag | 2;
|
|
||||||
piping.read(a,b)
|
|
||||||
},
|
|
||||||
writeLayer: (a,b) => {
|
|
||||||
flag = flag | 4;
|
|
||||||
piping.write(a,b)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
é.fingerPrint = Symbol("wire");
|
||||||
é.isWire = n => n?.fp == é.fingerPrint;
|
é.isWire = n => n?.fp == é.fingerPrint;
|
||||||
é.extract = (e,v) => typeof e=='function'?e(v):e;
|
é.extract = (e,v) => typeof e=='function'?e(v):e;
|
||||||
é.isSame = (a,b) => !é.diff(a,b);
|
é.isSame = (a,b) => !é.diff(a,b);
|
||||||
é.fingerPrint = Symbol("wire");
|
é.watch = (fn, assoc) => {
|
||||||
é.useEffect = (fn, assoc) =>
|
|
||||||
{
|
|
||||||
for (const wireVar of assoc)
|
for (const wireVar of assoc)
|
||||||
{
|
{
|
||||||
if(é.isWire(wireVar))
|
if(é.isWire(wireVar))
|
||||||
{
|
{
|
||||||
wireVar.useEffect(fn);
|
wireVar.watch(fn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
é.diff = (a,b,c) => {
|
é.diff = (a,b,c) => {
|
||||||
let cursoryDiffResult = é.cDiff(a,b);
|
let cursoryDiffResult = cDiff(a,b);
|
||||||
if(cursoryDiffResult == é.cDiff.adiff)
|
if(cursoryDiffResult == cDiff.adiff)
|
||||||
{
|
{
|
||||||
return é.adiff(a,b,c||[])
|
return adiff(a,b,c||[])
|
||||||
}else{
|
}else{
|
||||||
return cursoryDiffResult == é.cDiff.some ? false : true;
|
return cursoryDiffResult == cDiff.some ? false : true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
é.adiff = (a,b,c) => {
|
const adiff = (a,b,c) => {
|
||||||
if(c.includes(a) && c.includes(b))
|
if(c.includes(a) && c.includes(b))
|
||||||
{
|
{
|
||||||
console.error("Circular object detected !")
|
console.error("Circular object detected !")
|
||||||
return é.cObjectDiff(a,b);
|
return cObjectDiff(a,b);
|
||||||
}
|
}
|
||||||
let typea = a instanceof Array ? 0 : a.byteLength ? 1 : 2;
|
let typea = a instanceof Array ? 0 : a.byteLength ? 1 : 2;
|
||||||
let typeb = b instanceof Array ? 0 : b.byteLength ? 1 : 2;
|
let typeb = b instanceof Array ? 0 : b.byteLength ? 1 : 2;
|
||||||
|
@ -120,16 +135,16 @@ function é(defaultValue)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
é.cArrDiff = (a,b) => {
|
const cArrDiff = (a,b) => {
|
||||||
return a.length != b.length || !a.every((v,i) => a[i] === v)
|
return a.length != b.length || !a.every((v,i) => a[i] === v)
|
||||||
};
|
};
|
||||||
é.cObjectDiff = (a,b) => {
|
const cObjectDiff = (a,b) => {
|
||||||
return é.cArrDiff(
|
return cArrDiff(
|
||||||
Object.keys(a),
|
Object.keys(a),
|
||||||
Object.keys(b)
|
Object.keys(b)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
é.cDiff = (a,b) => {
|
const cDiff = (a,b) => {
|
||||||
switch(typeof a)
|
switch(typeof a)
|
||||||
{
|
{
|
||||||
case "undefined":
|
case "undefined":
|
||||||
|
@ -148,30 +163,95 @@ function é(defaultValue)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
é.cDiff.adiff = -1;
|
cDiff.adiff = -1;
|
||||||
é.cDiff.some = 0;
|
cDiff.some = 0;
|
||||||
é.cDiff.different = 1;
|
cDiff.different = 1;
|
||||||
é.pipeLine = () => {
|
|
||||||
let k = {};
|
é.prototype.fp = é.fingerPrint;
|
||||||
let reads = [];
|
é.prototype.diff = é.diff;
|
||||||
let writes = [];
|
é.prototype.get = function(){
|
||||||
k.read = (fn,pr) => reads.push({fn,pr});
|
if(this.flag & 2)
|
||||||
k.write = (fn,pr) => writes.push({fn,pr});
|
{
|
||||||
k.get = (val) => {
|
return this.piping.get(this.value)
|
||||||
let fns = reads.sort((a,b) => (a?.pr|0) - (b?.pr|0)),
|
}else{
|
||||||
real = val;
|
return this.value
|
||||||
for (const { fn } of fns) {
|
|
||||||
fn( real, e => real = e );
|
|
||||||
};
|
|
||||||
return real;
|
|
||||||
};
|
|
||||||
k.set = (val) => {
|
|
||||||
let fns = writes.sort((a,b) => (a?.pr|0) - (b?.pr|0)),
|
|
||||||
real = val;
|
|
||||||
for (const { fn } of fns) {
|
|
||||||
fn( real, e => real = e );
|
|
||||||
};
|
|
||||||
return real;
|
|
||||||
};
|
|
||||||
return k;
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
é.prototype.set = function(newValue){
|
||||||
|
if(this.flag & 16)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newValue = é.extract(newValue, this.value);
|
||||||
|
if(this.flag & 4)
|
||||||
|
{
|
||||||
|
newValue = this.piping.set(newValue)
|
||||||
|
};
|
||||||
|
if(this.diff(newValue,this.value))
|
||||||
|
{
|
||||||
|
this.flag = this.flag | 16;
|
||||||
|
if(this.flag & 1)
|
||||||
|
{
|
||||||
|
schedule((()=>{
|
||||||
|
this.effects.filter(e => e.o).forEach(k => k())
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
this.value = newValue;
|
||||||
|
this.version++;
|
||||||
|
if(this.flag & 1)
|
||||||
|
{
|
||||||
|
schedule((()=>{
|
||||||
|
this.effects.map(e => e.f());
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
this.flag = this.flag ^ 16;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const schedule = function(fn){
|
||||||
|
schedule.jobs.push(fn)
|
||||||
|
if(!é.schedule.executing)
|
||||||
|
{
|
||||||
|
requestAnimationFrame(()=>{
|
||||||
|
for (const fn of schedule.jobs) {
|
||||||
|
try{
|
||||||
|
fn()
|
||||||
|
}catch(e){
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
schedule.executing = false;
|
||||||
|
schedule.jobs = [];
|
||||||
|
é.prototype.watch = function(fn){
|
||||||
|
this.flag = this.flag | 1;
|
||||||
|
let k = {
|
||||||
|
f:fn,
|
||||||
|
o:undefined
|
||||||
|
};
|
||||||
|
requestAnimationFrame(()=> {
|
||||||
|
k.o = fn();
|
||||||
|
})
|
||||||
|
this.effects.push(k);
|
||||||
|
};
|
||||||
|
é.prototype.getVersion = function(){
|
||||||
|
return this.version;
|
||||||
|
}
|
||||||
|
é.prototype.equalTo = function(value){
|
||||||
|
return é.isSame(value, this.value)
|
||||||
|
}
|
||||||
|
é.prototype.readLayer = function(value){
|
||||||
|
this.flag = this.flag | 2;
|
||||||
|
this.piping.read(a,b)
|
||||||
|
}
|
||||||
|
é.prototype.writeLayer = function(value){
|
||||||
|
this.flag = this.flag | 4;
|
||||||
|
this.piping.write(a,b)
|
||||||
|
}
|
||||||
|
try{
|
||||||
|
module.exports = é;
|
||||||
|
}catch{
|
||||||
|
window.é = é;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
Loading…
Reference in New Issue