Мне нужен тип для значений с меткой времени, который имеет соответствующий экземпляр 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)
и некоторые другие помощники:
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)
Есть ли лучший способ сделать это? Я не видел синонимов паттернов, используемых с таким новым типом, поэтому чувствую, что пропустил что-то более идиоматическое.