Отметки времени - PullRequest
       29

Отметки времени

0 голосов
/ 06 мая 2018

Мне нужен тип для значений с меткой времени, который имеет соответствующий экземпляр 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)

Есть ли лучший способ сделать это? Я не видел синонимов паттернов, используемых с таким новым типом, поэтому чувствую, что пропустил что-то более идиоматическое.

...