adamc@699: structure Room = Broadcast.Make(struct adamc@699: type t = string adamc@699: end) adamc@699: adamc@699: sequence s adamc@699: table t : { Id : int, Title : string, Room : Room.topic } adamc@708: PRIMARY KEY Id adamc@699: adamc@732: fun chat id () = adamc@699: r <- oneRow (SELECT t.Title, t.Room FROM t WHERE t.Id = {[id]}); adamc@699: ch <- Room.subscribe r.T.Room; adamc@699: adamc@699: newLine <- source ""; adamc@699: buf <- Buffer.create; adamc@699: adamc@699: let adamc@699: fun onload () = adamc@699: let adamc@699: fun listener () = adamc@699: s <- recv ch; adamc@699: Buffer.write buf s; adamc@699: listener () adamc@699: in adamc@699: listener () adamc@699: end adamc@699: adamc@699: fun getRoom () = adamc@699: r <- oneRow (SELECT t.Room FROM t WHERE t.Id = {[id]}); adamc@699: return r.T.Room adamc@699: adamc@699: fun speak line = adamc@699: room <- getRoom (); adamc@699: Room.send room line adamc@699: adamc@699: fun doSpeak () = adamc@699: line <- get newLine; adamc@699: set newLine ""; adamc@699: speak line adamc@699: in adamc@699: return adamc@699:

{[r.T.Title]}

adamc@699: adamc@699: