带时间戳的值

mit*_*ndi 6 haskell newtype

我想要一个带有时间戳值的类型,它具有适当的Semigroup实例(最新值获胜).事实证明,Max (Arg UTCTime a)这正是我想要的,但直接合作真的很尴尬,所以我写了这个:

import Data.Semigroup
import Data.Thyme ()
import Data.Thyme.Clock

newtype Stamped a =
  Stamped' (Max (Arg UTCTime a))
  deriving (Show, Eq, Semigroup, Functor)
  -- Many other useful classes could be added here

pattern Stamped :: UTCTime -> a -> Stamped a
pattern Stamped s v = Stamped' (Max (Arg s v))

unstamp :: Max (Arg a b) -> b
unstamp (Max (Arg _ v)) = v

stamp :: IO a -> IO (Stamped a)
stamp a = do
  ts <- getCurrentTime
  result <- a
  pure (Stamped ts result)
Run Code Online (Sandbox Code Playgroud)

还有其他一些助手:

updateStamped :: TVar (Stamped a) -> Stamped a -> STM ()
updateStamped v n = modifyTVar v (<> n)

updateStamped' :: TVar (Stamped a) -> Stamped a -> STM ()
updateStamped' v n = modifyTVar' v (<> n)
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?我没有看到模式同义词与这样的新类型一起使用,所以我觉得我错过了一些更惯用的东西.