Мотивация этого вопроса заключается в следующем сценарии: у нас есть поток значений, которые представлены кодировкой Sum
. Предположим, что Either ByteString ByteString
, где мы представляем потоки байтов в ошибочных и хороших состояниях соответственно. Теперь у нас есть еще одна функция, которая может сжимать поток ByteString
. Можно ли запустить эту функцию на входном потоке Either ByteString ByteString
и сжать любой из них (не только Right
, но и Left
в случае, если вместо Right
получается Left
). Подпись типа функции compress
приведена ниже (я использую Streaming библиотека):
compress :: MonadIO m
=> Int
-- ^ Compression level.
-> Stream (Of ByteString) m r
-> Stream (Of ByteString) m r
Наш входной поток имеет тип Stream (Of (Either ByteString ByteString)) m r
. Итак, есть ли какая-то функция преобразования, которая может запускать compress
во входном потоке и выводить поток типа Stream (Of (Either ByteString ByteString)) m r
, где оба сжаты.
Мне кажется, что вместо этого я должен написать пользовательское compress
, скажем, eitherCompress
следующим образом:
eitherCompress :: MonadIO m
=> Int
-- ^ Compression level.
-> Stream (Of (Either ByteString ByteString)) m r
-> Stream (Of (Either ByteString ByteString)) m r
Это правильно? Если это так, как правильно написать eitherCompress
с помощью приведенной ниже функции из zstd
:
compress :: Int
-- ^ Compression level. Must be >= 1 and <= maxCLevel.
-> IO Result
Я написал stream
производителей, используя yield
, но я реализовал их для простых случаев, когда ввод является просто источником, а не потоком. Буду очень признателен за помощь в решении этой проблемы.