1 つの値が MVar であるレコードがあるとします。
data SomeRecord = SomeRecord { frobs :: MVar Integer }
Aesonを使用してJSONからエンコード/デコードできるようにしたいと考えています。エンコーディング時には、MVar がアンラップされ、生の値がエンコードされ、デコーディング時にはその逆が発生します。
IO (Maybe SomeRecord)
を返すFromJSONインスタンスと を返す ToJSON インスタンスを書けるようになればいいのですがIO ByteString
、Parser モナドは MonadIO のインスタンスではないので、それは不可能だと思います。
これまでのところ、MVar によって妨げられたレコードと MVar 型のないほぼ同一のレコードとの間で変換する関数を作成し、それをエンコード/デコードすることに頼ってきました。
そもそも MVar を自分の記録から除外する方法を見つけようとしました。それが理想になりそうです。しかし、何らかの理由でそれができないと仮定すると、JSON のエンコード/デコードを処理する簡単な方法はありますか?
編集:
私は間違った質問をしているのだろうか。たぶん、私のアプローチ全体が間違っています。私がやろうとしているのは、接続された多数のクライアント (それぞれが異なるスレッド上) がオブジェクトのリストを追加/編集/削除できるようにすることです。タイプは次のようになります。
-- the data type for each "room"
data Instance = Instance
{ iName :: T.Text
, iObjects :: M.HashMap T.Text (MVar Store)
...
}
-- the data type for a particular object in the room that can be changed
data Store = Store
{ sObject :: A.Value
...
}
各「部屋」には、Instance
その部屋のオブジェクトを保持する があります。インスタンス自体は、ハッシュマップの追加/削除を同期するために MVar にiObjects
あり、個々のストアは MVar にあるため、個々のオブジェクトが更新されている間、データ構造全体がブロックされる必要はありません。
したがって、更新操作は次のように進行します。
- iObjects ハッシュを取得するためのインスタンスの readMVar
- M.特定の店舗を検索する
- 更新を行うためのストアの modifyMVar
このようにネストされた MVar を使用するよりも慣用的な haskell アプローチはありますか? 理想的には、MVar をデータから遠ざける何らかの方法で、構造全体を永続化するのが簡単になります。