nv-data-fullmesh
Version:
full-mesh,mesh-map,sender-recver
127 lines (102 loc) • 2.72 kB
JavaScript
const nvmap = require("nv-map-basic");
const {
creat_id,
get_abbr,
ZWNJ,
add_repr,
} = require("nv-facutil-basic");
const {rename_cls} = require("nv-facutil-name");
const {
SYM_MP,
SYM_ND_RECV_FROM_CTRL,
SYM_CTRL_RECV_FROM_ND,
DFLT_RECV_FROM_HANDLER
} = require("./cmmn");
const _Node = require("./nd");
/*
const MODE_DICT = {
dict:"dict",
array:"array",
map:"map",
weakmap:"weakmap"
}
*/
const ERROR_DICT = {
invalid_init:new Error("can-only-be-map-or-array-or-dict")
}
function _init_with_dict(that,d) {for(let k in d) {that.add(d[k],k)}}
function _init_with_array(that,arr){
for(let i=0;i<arr.length;i++) {
that.add(arr[i],i)
}
}
function _init_with_map(that,mp){for(let e of mp) {that.add(e[0],e[1])}}
function _construct(that,o) {
if(o instanceof Map) {
_init_with_map(that,o);
} else if(o instanceof Array) {
_init_with_array(that,o);
} else if(o instanceof Object) {
_init_with_dict(that,o);
} else {
throw(ERROR_DICT.invalid_init)
}
}
class Mesh {
#mp = new Map();
#recv_from_nd_handler = DFLT_RECV_FROM_HANDLER
constructor(o) {_construct(this,o)}
////
init_with_dict(d) { _init_with_dict(this,d)}
init_with_array(arr){ _init_with_array(this,arr)}
init_with_map(mp){ _init_with_map(this,mp)}
////
get [SYM_MP]() {return(this.#mp)}
////
get length() {return(this.#mp.size)}
ls() {return(Array.from(this.#mp.keys()))}
[Symbol.iterator]() {return(this.#mp.values())}
////
add(data,id) {
let nd = new _Node(this,data,id);
this.#mp.set(nd.id,nd);
this[id] = nd;
return(nd)
}
rm(id) {
let nd = this.#mp.get(id);
if(nd === undefined) {
} else {
delete this[id]
nd = nd.disconn()
}
return(nd)
}
////
get recv_from_nd_handler() {return(this.#recv_from_nd_handler)}
set recv_from_nd_handler(handler) {this.#recv_from_nd_handler = handler}
[SYM_CTRL_RECV_FROM_ND](src,msg) {
this.#recv_from_nd_handler(src,msg,this);
}
broadcast(msg) {
this.#mp.forEach(
nd => nd[SYM_ND_RECV_FROM_CTRL](this,msg)
);
}
multicast(dsts,msg) {
dsts.forEach(
nd => nd[SYM_ND_RECV_FROM_CTRL](this,msg)
);
}
send_to(dst,msg) {dst[SYM_ND_RECV_FROM_CTRL](this,msg)}
////
to_dict() {return(nvmap.to_dict(this.#mp))}
to_map() {return(nvmap.cp(this.#mp))}
to_weakmap() {return(nvmap.to_wmap(this.#mp))}
}
function _repr(that) {return(that[SYM_MP])}
add_repr(Mesh,_repr);
module.exports = {
ERROR_DICT,
Mesh
}