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) } }