хмм, как бы красиво сделать ленивый лог
такая спископодобная структура, в которую можно добавить элемент в конец, из которой можно прочесть любые элементы, и которая блокирует читателя если элемента ещё не существует
и всё это в STM
@l29ah Проиграл с вопроса; да, видел. Но все равно не понимаю, что за «блокировать читателя если элемента не существует». Ты, видимо, забыл описать метаинформацию, которая с каждой записью ассоциируется и по которой потом можно эти записи фильтровать и запрашивать?
@minoru Индекс блять. Который size_t. Когда-нибудь файл видел? Это файл будет. Натуральный файл, экспортирующийся через 9P. Чтобы мог желающий на него подсесть и смотреть че там у хохлов в реальном времени.
@ndtimofeev Ты блять хули тебе не понятно блять? Файлы никогда не читал???? Я хочу тупо сука файл который можно читать как обычный файл, с тем лишь отличием, что если его дочитать до конца и пытаться читать моар, он не вернёт ноль байтов а заблокируется и вернёт новую инфу когда в бекенд её принесут.
@l29ah Окей. Давай я интуитивно решу что 4 пункт не нужен. Первые три у меня в голове не связаны вообще. Какие вопросы я должен задать тебе кроме «под чем ты?» или «что ты хочешь?».
@l29ah Тогда ты хочешь data List a = Cons a (TVar (Maybe (List a))) | Nil в худшем случае. Можно просто заебенить список, где хвост будет fix $ \next -> unsafePerformIO $ atomicaly (readTMVar var) >>= \xs -> return (xs ++ next)
@l29ah Если ты хочешь строго O(1) то идёшь на хуй, я же сказал. В реальном мире у тебя либо совсем говно какое-то, либо ByteString'и достаточно велики чтобы быстро перебрать несколько в поисках того где лежит твой элемент.
@l29ah Как вариант ты можешь сделать TVar (ByteString, STM Word8). Тогда тот кому не хватило байта в массиве, лочится на STM'е, а когда байт приходит перезаписываешь структуру и массив на хуй.
@l29ah Блокируется только тот, кто хочет данных которые вышли за границу массива. Да, ты будешь при каждом запросе проверят out of range. Ничего не поделаешь это флеш.
@ndtimofeev Тот кто заблокировался за границей блокирует всех кто тоже хочет за границу, причём отпускат только когда удовлетворит свою жажду, иначе яннп чо ты там делаешь с этим байтом и из контекста кого.
@l29ah Ох… Тебе нужна структура внутри которой находится TVar с твоим массивом и функция которая пытается в STM'е почитать байт в произвольной позиции. Если ты не вылетел за границы массива, отдал байт. Если вылетел, то залип до тех пор пока не вылетел (то есть до тех пор пока TVar не обновили). Ну какого хера тебе не понятно?
@l29ah Когда ты выполняешь транзакцию внутри которой тем или иным образом вызван retry рантайм ghc не станет её повторять до тех пор пока не обновят хотя бы один TVar из тех что в ней участвовал. То есть в твоём случае TVar с байтстрингом.
За O(1)?
Т.е. «прочитать» = «изъять»? Опиши подробней, как это работает.
@l29ah Проиграл с вопроса; да, видел. Но все равно не понимаю, что за «блокировать читателя если элемента не существует». Ты, видимо, забыл описать метаинформацию, которая с каждой записью ассоциируется и по которой потом можно эти записи фильтровать и запрашивать?