Newer
Older
AlgebraicDataflowArchitectureModel / AlgebraicDataflowArchitectureModel / models / OnlineBattleGame2.model
channel Signup {
	out accounts(acDB:Map, signUp(aid:Str, name:Str)) = insert(acDB, aid, {"name": name, "point": 0})
}

channel ChangeName(aid:Str) {
	out accounts.{aid}.name(prevName:Str, changeName(name)) = name
}

channel CreateRoom {
	out rooms(rmDB:Map, createRoom(rid:Str)) = insert(rmDB, rid, {"members": nil, "battle": false})
}

channel AddRoomMember(rid:Str) {
	out rooms.{rid}.members(mList:List, addRoomMember(id:Str)) = append(mList, {"id": id})
}

channel Battle(rid:Str) {
	out rooms.{rid}.battle(prevHasWon, battle(hasWon:Bool)) = hasWon
}

channel UpdateName(rid:Str, mno:Int) {
    in rooms.{rid}.members.{mno}.id(prevMid:Str, updateName(mid, name)) = mid 
    in accounts.{mid}.name(prevName:Str, updateName(mid, name)) = name
    out rooms.{rid}.members.{mno}.name(prevName:Str, updateName(mid, name)) = name
}

channel UpdatePoint(rid:Str) {
	in rooms.{rid}.battle(prevState, updatePoint(hasWon, mid)) = hasWon
	for EachMember(mno:Int) {
		ref rooms.{rid}.members.{mno}.id(mid:Str, updatePoint(hasWon, mid))
		out accounts.{mid}.point(prevPoint:Int, updatePoint(hasWon, mid)) = if(hasWon, prevPoint + 1, prevPoint)
	}
}