• ? Haskell хмм, как бы красиво сделать ленивый лог
    такая спископодобная структура, в которую можно добавить элемент в конец, из которой можно прочесть любые элементы, и которая блокирует читателя если элемента ещё не существует
    и всё это в STM

Replies (16)

  • @L29Ah, Что значит элемента не существует?
  • @ndtimofeev, Спиздил кто-то.
  • @L29Ah, Dequeue для stm где-то валялось, оно? В крйюайнем случае на TVar это элементарно пишется, "блокировка" (ретрай) тоже должна быть прям в апи
  • @ndtimofeev, Значит блядь дочитали до конца лога и ещё хотим читать, а никто ещё не насрал, такая вот беда.
  • @qnikst, Dequeue не блочится.
  • @L29Ah, Это не совсем элемента нет. Исходя из текста можно скорее предположить, что запись об элементе есть, а данные ещё не подсосались и подсасываются в рандомном порядке.
  • @L29Ah, bnw.im — он хочет это
  • @L29Ah, STM-ный? api покажи
  • @ndtimofeev, /me увидел bnw по ссылке и не стал открывать
  • @qnikst, Надо попросить Штилетту добавлять обфусйированные линки на все записи.
  • @qnikst, В общем, если тебе STM то фейлящиеся операции должны делать retry и в таком виде отдавать апи пользователю, там он уже или согласится с этой идеей или завернет в <|> и сделает небоокирующимся, про саму структуру я не совсем понял что такое читать любой элемент и порядок в этом случае.
  • @ndtimofeev, На самом деле прочитал, я не люблю bnw но не настолько, чтобы и нормальные треды там не смотреть
  • @qnikst, Где ты нашёл стмный?
  • @qnikst, Массив видел когда-нибудь?
  • @L29Ah, import Control.Concurrent.STM

    import qualified Data.Vector as V

    newtype Log a = Log (TVar (V.Vector a))

    (<~) :: a -> Log a -> STM ()
    x <~ (Log w) = modifyTVar w (V.cons x)

    (~>) :: a -> Log a -> STM ()
    x ~> (Log w) = modifyTVar w (flip V.snoc x)

    getLog :: Log a -> Int -> STM a
    getLog (Log w) i = do
    v <- readTVar w
    case v V.!? i of
    Nothing -> retry
    Just x -> return x


    эффективную структуру сам подберёшь
  • @qnikst, getLog :: Log a -> Int -> STM a
    getLog (Log w) i = do
    v <- readTVar w
    maybe retry return (v V.!? i)