onChanges :: Eq a => (a -> IO ()) -> TVar a -> IO b
onChanges f tvar = readTVarIO tvar >>= go where
go a = do
a' <- atomically do
a' <- readTVar tvar
when (a == a') retry
pure a'
f a'
go a'
别担心,这不贵。每个
重试
将阻塞,直到
TVar
再次被写入。如果相等性检查比运行更昂贵
f
,或者如果你想跑步
f
在每次写入时,即使值没有改变,您也可以额外存储
Int
或在你的
TVar
说出它被写了多少次,并检查一下以决定是否
重试
或者不。