OPA を評価してリアルタイムの共同スプレッドシートを作成します (ソースはこちら: https://github.com/omarbenhamid/Cloudsheet/blob/master/cloudsheet.opa )
スプレッドシートをリアルタイムで呼び出してもらいたいのですが、スプレッドシートを表示しているすべてのユーザーに更新を伝えるために、スプレッドシートごとに Network.cloud を作成したいと考えています。
各セルは<input type="text" onkeypress={event->keyboard_update(event,sheetname,row,column)}/>
が呼び出されたときkeyboard_update
に、スプレッドシートの雲にメッセージをブロードキャストして、他のビューアーが更新されるようにしたいと考えています。しかし、ここに私の問題があります:
keyboard_update(event,sheetname,row,column) = (
Network.broadcast({/*my update notif message*/}, Network.cloud(sheetname))
)
これは、Network.cloud の API ドキュメントに次のように記載されていても、呼び出しごとに新しいネットワークが作成されるように動作します。
「1 つまたは複数のサーバーが同じ値 k で Network.cloud(k) を呼び出すと、実際に作成されるネットワークは 1 つだけです」
私が見つけた唯一の解決策は、グローバルミュータブルに保存されている連想リストで雲にインデックスを付けることです:
clouds = Mutable.make([] : list((string,Network.network(message))))
そして、List.assoc を使用してクラウドを取得し、必要に応じて最終的にインデックスに追加します (ソース コードの関数 getcloud を参照)。
Network.cloud(sheetname) を Network.broadcast のパラメーターとして使用する最初のアプローチが誤動作するのはなぜですか?