Ага, BSL.readFile. Интересно, что если, например, сделать так: extract :: BSL.ByteString -> [Word32] extract = run where run :: BSL.ByteString -> [Word32] run "" = [] run s = getWord32LE (BSL.toStrict (BSL.take 4 s)) : run (BSL.drop 4 s) И далее print (take 16 (extract bsl)), то программа проходится по всему файлу. В целом, понятно почему, но как сделать это всё дело ленивым, я как-то понять не могу
меня немного волнует паттерн "" тут для бсл
Ленивая строка только первый чанк сравнит по идее
может бтв взять какую-нибудь готовую либу для стримингового парсинга бинарей?
Это скучно! Хочется самому разобраться и понять, как вообще с этой ленью работать
Наверное, можно было бы взять и обычный conduit. Всё равно ByteString надо гонять. Хотел сделать, как здесь, но как-то сложно императивный код переписывать, думаю, так делать не надо, надо подумать и написать так, как это должно быть написано на Haskell. (Имплементация на C работает так: храним состояние в структурке (длину уже обработанных данных, 16 байт на сам хеш и 64 байта для буфера. он нужен, на случай если длина блока не будет делиться на 64, мы могли сохранить эти байтики), далее обрабатываем последовательно блоки с помощью hash_update, когда мы придём к последнему блоку, дополним его так, чтобы его длина в байтах была кратна 64, посчитаем в последний раз хеш, вернём хеш hash_finalize)
Обсуждают сегодня