Пиздец, как меня бесит редисовый драйвер для хаскеля (hedis), при чем чем дальше -- тем сильнее.
Сначала бесит тем, что хуй в нем разберешься из-за типов (сделали выверт через обобщение монад, в результате все имеет тип вида
```
set :: RedisCtx m f => ByteString key -> ByteString value -> m (f Status)
```
эм эф стринг, блять. Вот сразу очевидно что это, новичем придет и не сможет два байта в редис отослать. Позор, кароч.
Потом начало раздражать когда он зависать начал -- оказалось, что все сделано на ([s]честном слове[/s]) ленивых вычислениях, завязано на attoparsec в алгоритме и так далее. Ну, это ладно еще.
Но вот что до сих пор добивает -- неразбериха с типами, которые вообще не к пользователю повернуты. С одной стороны типами пытаются, вроде бы, отобразить протокол, делая их максимально неудобными для конечного пользователя, -- а с другой не делают таких вещей как прием непустых списков в аргумент (в результате если вы сделаете `Redis.sadd "foo" []` -- вас ждут страшные муки).
Ну и вот сейчас, т.к. пишу новый кусок, пробовал честно обрабатывать все ошибки -- не получилось. Вот кусок кода:
```
r <- liftIO $ R.runRedis (s ^. redisConn) $ R.multiExec $ do
R.set (getJobStateKey jid) (toStrictByteString (J.encode state))
R.sadd jobStateKeysSetKey [(toStrictByteString . unJobId) jid]
return $ fmapR (const jid) $ redisTxToEither r
```
Вроде ж бы весь этот runRedis вернет результат `Either Reply a`, то есть как раз то, что нужно, типа если `Left reply` -- знач ошибка, если `Right a` -- зрач результат (на самом деле здесь он мне не нужен).
Но компилятор честно предупреждает, что R.set возвращает значение, а я его не использую. Перед тем, как сделать игнор значения через `_ <- R.sadd ...` решил пойти проверить что там, и оп! Оказалось, что и там возвращается некоторый Status, который тоже может быть Ok, а может быть и не Ok а очень даже ошибкой.
Тут уж я не знаю, виноват ли редис или драйвер, но сделано это все крайне неудобно, почти уверен, что все текущие пользователи редиса из хаскеля кладут на это болт и все игнорируют.
Данкен, ау фидерзейн.