Newer
Older
AlgebraicDataflowArchitectureModel / AlgebraicDataflowArchitectureModel / models / GroupChat.model
channel Signup {
	out accounts(acDB:Map, signUp(aid:Str)) = insert(acDB, aid, {"notifications": nil})
}

channel HasRead(aid:Str) {
	out accounts.{aid}.notifications(ntMap:Map, hasRead(gid:Str)) = delete(ntMap, gid)
}

channel CreateGroup {
	out groups(grDB:Map, createGroup(gid:Str)) = insert(grDB, gid, {"members": nil, "messages": nil})
}

channel AddGroupMember(gid:Str) {
	out groups.{gid}.members(memList:List, addGroupMember(aid:Str)) = append(memList, aid)
}

channel PostMessage(gid:Str) {
	out groups.{gid}.messages(mesList:List, postMessage(message:Str)) = append(mesList, message)
}

channel Notify(gid:Str) {
	in groups.{gid}.messages(prevMesList, notify(m)) = mesList
	for EachMember(mno:Int) {
		ref groups.{gid}.members.{mno}(m.{mno}:Str, notify(m))
		out accounts.{m.{mno}}.notifications(prevNtMap:Map, notify(m)) = insert(prevNtMap, gid, true)
	}
}