Published
Edited
Jan 28, 2021
Insert cell
md`# Chat Propagate`
Insert cell
settings = ({branching: 3})
Insert cell
mutable env = ({})
Insert cell
mutable index= []
Insert cell
ndx(env[index[1]].id, env[index[1]].id+".peace", 1)
Insert cell
function ndx(uid, convon, inx){
let b = settings.branching
let inx0 = inx - 1
console.log(uid)
if (inx0 == 0) return env[uid].id;
if (inx0 >= b+1) return ndx(env[env[uid].convos[convon].children[Math.floor(inx0 / b)-1]].id, convon, (inx0 -Math.floor(inx0 / b)*b)+1)
return env[env[uid].convos[convon].children[inx0-1]].id;
}
Insert cell
function genUserConvo(title, uid){
let uconvo = uid+"."+title
let convo = {
t: "r",
o: uid,
id: uconvo,
mes:[genTopicMessage("User "+uid+" will write about '"+title+"'.", true)],
left: [], right: [], children: [],
lastMes: Date.now()
}
convo.propagate = function(mes){
let now = Date.now()
if (convo.lastMes == now) return;
convo.lastMes = now
convo.mes.push(genTopicMessage(mes, true));
if (convo.children.length > 0) {
for (let ndx = 0; ndx < convo.children.length; ndx++){
env[convo.children[ndx]].send(uconvo, mes)
}
}
env[convo.right[0]].send(uconvo, mes)
}
convo.addBrother = function(id2){
if (!env[index[1]].convos[convo.id].right[0]){
env[index[1]].convos[convo.id].right[0] = id2
env[index[1]].convos[convo.id].left[0] = id2
env[id2].convos[convo.id].right = [index[1]]
env[id2].convos[convo.id].left = [index[1]]
} else {
let temp = env[index[1]].convos[convo.id].right[0]
env[index[1]].convos[convo.id].right[0] = id2
console.log("temp",temp)
env[temp].convos[convo.id].left[0] = id2
env[id2].convos[convo.id].right = [temp]
env[id2].convos[convo.id].left = [index[1]]
}
}
return convo;
}
Insert cell
function genUserConvo2(title, uid){
//console.log(env,env[uid])
let uconvo = uid+"."+title
let convo = {id: uconvo, t: "t", mes:[genTopicMessage("User "+uid+" will write about '"+title+"'.", true)], children: [], parent: null, loc:1}
convo.propagate = function(mes){
convo.mes.push(genTopicMessage(mes, true));
for (let ndx = 0; ndx < convo.children.length; ndx++){
env[convo.children[ndx]].send(uconvo, mes)
}
}
// topic.subscribe = function(userid, topic){
// ans.addTopic(topic)
// env[userid].topics[topic].addChild(topic, ans.id)
// }
convo.addChild = function(id2){
let b = settings.branching
let location = env[index[convo.loc]].convos[convo.id]
if (location.children.length < b) {
location.children.push(id2)
env[id2].convos[convo.id].parent = index[convo.loc]
return convo.loc;
} else {
convo.loc=convo.loc+1
env[index[convo.loc]].convos[convo.id].children.push(id2)
env[id2].convos[convo.id].parent = index[convo.loc]

return convo.loc
}
}
return convo;
}
Insert cell
function getBaseLog(x, y) {
return Math.log(y) / Math.log(x);
}
Insert cell
function genTopicMessage(mes, out){
let m = {};
m.t = Date.now();
m.m = mes;
m.out = out;
return m
}
Insert cell
function genUser(id, name, tk){
let user = {id: id, tk: tk, name: name};
//ans.messages = { in:[], out:[]}
user.convos = {}
user.addConvo = function(convon, userid){
if (!userid) userid = user.id
let uconvo = userid +"."+ convon
user.convos[uconvo] = genUserConvo( convon, userid)
//console.log(user.id, uconvo, user.convos[uconvo])
}
user.send = function(id2, mes){
let uconvo = user.id+"."+id2
//console.log("ddddd", user.convos[uconvo], uconvo, this.id, this, env[user.id].convos[uconvo])
env[user.id].convos[uconvo].propagate(mes)
//env[id2].receive(user.id, mes)
}

user.receive = function(id2, mes){
user.messages.in.push({t:Date.now(), user: id2, m: mes})
}
user.subRO = function(convon,userid ){
let uconvo = userid+"."+convon
user.addConvo(convon, userid)
user.convos[uconvo].mes = env[userid].convos[uconvo].mes
//let local = env[userid].convos[uconvo].addChild(user.id)
let local = env[userid].convos[uconvo].addBrother(user.id)
env[userid].convos[uconvo].loc = local
}
user.unsubRO = function(uconvo){
let left = user.convos[uconvo].left[0];
let right = user.convos[uconvo].right[0];
user.convos[uconvo].left = []
user.convos[uconvo].right = []
env[left].convos[uconvo].right[0] = right;
env[right].convos[uconvo].left[0] = left;
}
user.unsubRO2 = function(convon,userid ){
console.log("unsubuser",user)
let uconvo = userid+"."+convon
let ownChildren = user.convos[uconvo].children
let distal = env[userid].convos[uconvo].loc
console.log("ggg",distal,index)
let udistal = env[index[distal]].convos[uconvo].children
let endor = udistal[udistal.length-1]
udistal = udistal.splice(0, udistal.length-1)
console.log(udistal,endor)
env[endor].convos[uconvo].children = JSON.parse(JSON.stringify(ownChildren))
env[endor].convos[uconvo].parent = user.convos[uconvo].parent
var index1 = env[user.convos[uconvo].parent].convos[uconvo].children.indexOf(user.id);
env[user.convos[uconvo].parent].convos[uconvo].children[index1] = env[endor].id
user.convos[uconvo].parent = null
user.convos[uconvo].children = []
index[env[endor].convos[uconvo].loc+1] = endor
// for (let ndx = 0; ndx < 16; ndx++) {
// }
console.log("parent",user.convos[uconvo].parent)
}

return user;
}
Insert cell
{
let root = null
for (let i=0; i<10; i++) {
let id = uuidv4();
env[id] = genUser(id, id, i);
index[i+1] = id
if (i > 0 && i < 9) {
//console.log(id,root,env)
env[id].subRO("peace", root )
} else {
root = id;
env[root].addConvo("peace");
}
}
//console.log(env[index[1]])
env[index[1]].send("peace", "some message 2.")
}
Insert cell
index[0]
Insert cell
{
mutable env = {}
mutable index = []
}
Insert cell
env[index[1]].send("peace", "some message 24.")

Insert cell
{
console.log(env[index[1]])
env[index[2]].unsubRO(index[1]+".peace")
console.log(env[index[1]])
}
Insert cell
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more