Alexander
ядро не копирует данные с пейджи себе и говорит что все ок
Denis
ну это вот с гифтом
Alexander
а тупо использует эту страницу
Alexander
угу
Denis
а без гифта в общем случае я не особо понял
Alexander
я могу поискать статьи
Alexander
там порядка 4-6 копирований если без этого
Alexander
с этим 2-3
Denis
в статьях tldr обычно
Alexander
ну блогопост
Alexander
из 6 частей
Alexander
-)
Denis
ну ладно, я раз в пять лет про лоулевел что-то делаю
Denis
оно вроде даже и интересно, но как-то скабрезно обычно
Alexander
поидее если это понять и понять как haskell либы писать то можно запилить когда-нить
Denis
переносимость пострадает
Alexander
я вот не до конца понимаю как правильно писать
Denis
компилятора
Alexander
есть LBS это такой стрим для бедных
Alexander
но при этом если писать его "тупо", то он очень плохой формы
Alexander
при этом операции над ним медленные а часто возвращают тоже LBS уже совсем без толку
Alexander
т.е. а. я бы обрадовался операциям над LBS возвращающим BS, без явного BS.fromChunks
Alexander
есть Builder, который нормальный интерфейс для дампа
Alexander
т.е. правильнее было бы вместо LBS возвращать Builder
Alexander
тогда caller может собрать его как надо
Alexander
или вообще даже отстримить
Denis
звучит разумно
Alexander
тут вообще выглядит как fusion
Alexander
или что-то рядом
Alexander
дальше
Alexander
у Builder есть проблема
Alexander
он чистый
Alexander
т.е. я могу его нормально вернуть только если сделаю все эффекты, вот как в этой программе
Alexander
но жизнь обычно сложнее и я буду хотеть и эффекты
Alexander
для этого у нас есть Streams всякие и кондуитопаймы
Alexander
т.е. Stream (Of Chunk) m a возволяет вернуть стрим с эффектами
Alexander
ну и дурацким a как результат (не понимаю пока нравится мне это или нет)
Alexander
т.е. формально мы можем какой-нить сервер описать как Stream (Of Chunk) a и правильно разложить эффекты
Alexander
консьюмер тогда может вызывать какой-то fold (аналог toLBS) или стримить дальше
Alexander
ещё есть Data.Vector.Fusion.Stream тоже неплохая структура
Alexander
он тоже умеет эффекты, результаты и пропуски
Alexander
у него нету возвращаемого значения (которое я не понял нравится мне или нет)
Alexander
они фьюзятся и вообще можно приятные штуки делать
Alexander
интересная вещь, что если мы говорим о байтостроках, то с у векторов появилось Bundle
Alexander
это такой Stream в котором можно сразу пачку элементов отдавать (достаточно сложная структура правда)
Alexander
поидее он прикольнее ещё и тем, что можно делать не Stream ByteString а Bundle Word8
Alexander
и консьюмер может или его посимвольно проходить или паковать или что ещё
Alexander
но это ещё не все
Alexander
часто мы хотим вообще что-то хитрое делать, например писать в файл
Alexander
с буффером и в общем-то нам пофиг что там будет происходить
Alexander
и вот в go мы делаем foo = new FdBuffer(stdout, bufferSize) (не помню что там было)
Alexander
и дальше можем делать в него append или fold или что ещё
Alexander
вот это вроде тоже частая вещь, т.е. кроме посылания стрима мы можем хотеть создавать Sink
Alexander
а, про билдер
Alexander
билдер нельзя в треды разослать
A64m
ну да, композится такой забиватель буфера, которому потом передаешь собственноручно саллоцированный буфер и он в него пишет
Alexander
т.к. работа будет дублироваться, вот для этого уже LBS нужен
Alexander
вот fast-builder что-то такое хотели но кривовато
Alexander
и закрытое множество
Alexander
GrowableBuffer, Handle, AnotherThread
Alexander
т.е. вокруг всего этого можно как-то сделать композабельное streaming API
Alexander
причем подуменьшить кол-во типов, т.к. LBS тут почти не нужен
Alexander
только для случая шаренья уже сделанной работы
Alexander
а да, ещё на самом то деле очень часто не хочется чтобы Builder вообще существовал
Alexander
т.е. хорошо бы, чтобы он фьюзился почти всегда
Alexander
вот, это у меня скопилось, а как это собрать во что-то итоговое я не знаю
Alexander
читать все этим самым Stream (Of ByteString) / Bundle Word8 а строгие строки это врапперы над fold-ом их
Alexander
+ может дополнительные штуки типа вызова stat и подборки хороших параметров
Алексей
А разве строгая байтострока это не обёртка над куском памяти?
Alexander
ForeignPtr Word8 + Size + Offset
Алексей
Ну да
Alexander
а, я про операции
Alexander
т.е. hGet для строгой байтостроки может быть обертной над hGetStream
Alexander
сейчас там чуть ли не полная дубликация кода
Alexander
причем внутри всякие полезные методы, которых юзеру никто не дал
Alexander
и их надо пересобирать используя .Internal, .Unsafe и т.п.
Alexander
но у всего этого "плана" есть проблема
Alexander
я боюсь что он потребует найти хорошие настройки/типы которые устроят всех
Alexander
или будет какой-то набор заготовок и примитивов, которые нужно уже компановать с третьими библиотеками
分解物質
www.codewars.com/kata/tiny-three-pass-compiler/haskell