UNPKG

nv-data-fullmesh

Version:

full-mesh,mesh-map,sender-recver

127 lines (102 loc) 2.72 kB
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 }