# Changelog for Hedis

## 0.16.2

- Add support for Redis 8.8 commands: `arcount`, `ardel`, `argetrange`, `argrep`, `argrepOpts`, `argrepWithValues`, `argrepWithValuesOpts`, `arinfo`, `arinfoFull`, `arinsert`, `arlastitems`, `arlastitemsOpts`, `arlen`, `armget`, `arnext`, `aropValue`, `aropCount`, `arring`, `arscan`, `arscanOpts`, `arseek`, `arset`, `increx`, `xidmprecord`, `xcfgset`, `xnack`.
- Add support for Redis 8.6 commands: `commandList`, `hotkeysStart`,  `hotkeysGet`, `hotkeysStartOpts`, `hotkeysStop`, `hotkeysReset`.
- Add support for Redis 8.4 commands: `DELEX`, `DIGEST`, `MSETEX`, `VRANGE`, and `CLUSTER MIGRATION`.
- Add support for Redis 8.2 stream and cluster commands: `XACKDEL`, `XDELEX`, and `CLUSTER SLOT-STATS`.
- Add support for additional Redis 6.2, 7.0, 8.0 commands (COPY, GETDEL/GETEX, HRANDFIELD, LMPOP/ZMPOP, SINTERCARD, FUNCTIONS, COMMAND LIST, etc.)
- Add support for Redis vector set commands
- Add support for RedisJSON commands including `jsonArrappend`, `jsonArrindex`, `jsonArrindexOpts`, `jsonArrlen`, `jsonArrlenAt`, `jsonArrinsert`, `jsonArrpop`, `jsonArrpopAt`, `jsonArrpopAtIndex`, `jsonArrtrim`, `jsonClear`, `jsonClearAt`, `jsonDebug`, `jsonDebugMemory`, `jsonDebugMemoryAt`, `jsonDel`, `jsonDelAt`, `jsonForget`, `jsonForgetAt`, `jsonGet`, `jsonGetOpts`, `jsonMerge`, `jsonMget`, `jsonMset`, `jsonNumincrby`, `jsonNummultby`, `jsonObjkeys`, `jsonObjkeysAt`, `jsonObjlen`, `jsonObjlenAt`, `jsonResp`, `jsonRespAt`, `jsonSet`, `jsonSetOpts`, `jsonStrappend`, `jsonStrappendAt`, `jsonToggle`, `jsonType`, and `jsonTypeAt`.
- Add support for Top-K sketch commands: `topkAdd`, `topkCount`, `topkIncrby`, `topkInfo`, `topkList`, `topkListWithCount`, `topkReserve`, and `topkQuery`.
- Add support for t-digest sketch commands: `tdigestAdd`, `tdigestByrank`, `tdigestByrevrank`, `tdigestCdf`, `tdigestCreate`, `tdigestCreateOpts`, `tdigestInfo`, `tdigestMax`, `tdigestMerge`, `tdigestMergeOpts`, `tdigestMin`, `tdigestQuantile`, `tdigestRank`, `tdigestReset`, `tdigestRevrank`, and `tdigestTrimmedMean`.
- Add support for RedisTimeSeries commands: `tsAdd`, `tsAddOpts`, `tsAlter`, `tsCreate`, `tsCreateOpts`, `tsCreaterule`, `tsCreateruleAlign`, `tsDecrby`, `tsDecrbyOpts`, `tsDel`, `tsDelrule`, `tsGet`, `tsGetOpts`, `tsIncrby`, `tsIncrbyOpts`, `tsInfo`, `tsInfoOpts`, `tsMadd`, `tsMget`, `tsMgetOpts`, `tsMrange`, `tsMrangeOpts`, `tsMrevrange`, `tsMrevrangeOpts`, `tsQueryindex`, `tsRange`, `tsRangeOpts`, `tsRevrange`, and `tsRevrangeOpts`.
- Add support for wait commands: `wait` and `waitaof`.
- Add a dedicated function command module reexporting `functionDelete`, `functionDump`, `functionFlush`, `functionFlushOpts`, `functionKill`, `functionLoad`, `functionLoadReplace`, `functionRestore`, `functionRestoreOpts`, and `functionStats`.

## 0.16.1

- PR #248 Introduced nix flakes and reproducible build environment. Thanks to Christian Georgii
- PR #249 PubSub supported on a cluster
- PR #250 All geospatial commands were supported.
- PR #251 New withPubSub for lightweight connections were introduced
- PR #253 Add runRedisNonBlocking function that will skip action if no connections in the pool are
  available. Thanks to Chordify

## 0.16

- PR #176. Exposed RedisArg type class so it's possible to (de)serialize application data structures.
- PR #182. Add MonadTrans instance for MonadRedis.
- PR #198. Extended Redis 6 and 7 support.
  - add `xgroupCreate`, `xgroupCreateConsumer`, `xgroupSetId`;
  - added support of the message trimming by message;
  - add support for count parameter for approximate trimming.
- New internal functions `unsubscribe1`, `punsubscribe1` functions that do not remove all subscriptions when empty lst is passed
- Fixes in cluster support:
  - connect authorizes with all nodes
  - TLS connection is instantiated with all nodes
  - Fixed resource leakage
- Added new methods for the cluster mode:
  - requestMasterNodes, masterNodes, getRandomConnection


Breaking changes:

- **Connection** Fix connection API.

  ```haskell
  data PortID = PortNumber NS.PortNumber
              | UnixSocket String
              deriving (Eq, Show)
  ```

  And introduce instead `ConnectAddr`:

  ```haskell
  data ConnectAddr
    = ConnectAddrHostPort NS.HostName NS.PortNumber
    | ConnectAddrUnixSocket String
    deriving (Eq, Show)
  ```

  It allow to remove a hack with ignored path.

- **URI parsing** follows the redis client spec. Main changes:

  1. In `redis://password@host`, `password` is parsed as a password instead of a username.
  2. `redis-socket://[[username:]password@]path` is supported.

- **xpendingDetail** instead of 'Maybe ByteString' for a consumer name the method
receives XPendingOpts structure that can take number of milliseconds and consumer name.
In order to preserve an old behavior code should be rewritten as:

``` haskell
xpendingDetails s g f l t Nothing -> xpendingSummary s g f l t defaultXPendingDetailOpts
xpendingDetails s g f l t (Just c) -> xpendingSummary s g f l t defaultXPendingDetailOpts{xPeedingDetailConsumer=Just c)
```

- **xpendingSummary** no longer accepts consumer arguments as it was done in violation to spec and methodd never worked this way
- **XTrimOpts** type changed, because previous type didn't hold library invariants now instead of a simple ADT XTrimOpts is data that defines strategy of trimming and type, exact or approximate. Here is a conversion table:
  NoArg -> is not representable,
   In xaddOpts options use Nothing instead;
   In xtrim using NoArgs as a bug.
  Maxlen n -> TrimOpts{trimOptsStrategy=TrimMaxlen n, trimOptsType=TrimExact};
  MaxlenApprox n -> TrimOpts{trumOptsStrategy=TrimMaxlen n, trimOptsType=TrimApprox Nothing};
- 'addChannelsAndWait', 'removeChannelsAndWait' now wait only the channels that we run
  operations on, instead of waiting changes from all threads.
- `xreadGroupOpts` now accepts new `XReadGroupOpts` instead of `XReadOpts` type.

## 0.15.2

* PR #189. Document that UnixSocket ignores connectHost
* PR #190. mtl version update

## 0.15.1

* PR #181. Add MonadUnliftIO instance

## 0.15.0

* PR #174, Issue #173. Hedis fails to decode xstreamInfo response in case when the stream is empty

## 0.14.3

* PR #171. Support GHC 9

## 0.14.2

* PR #163. support for redis 6.0 COMMAND format
* PR #164. remove invalid tests for Redis Cluster

## 0.14.1

* PR #162. Improved documentation for EVALSHA

## 0.14.0

* PR #157. Clustering support

## 0.13.1

* PR #158. Upgrade to Redis 6.0.9 & Fix auth test
* PR #160. Fix GHC 8.0.1 compat

## 0.13.0

* PR #159. Issue #152. Make HSET return integer instead of bool

## 0.12.15

* PR #154. Implement Redis Sentinel support

## 0.12.14

* PR #153. Publicly expose ConnectTimeout exception

## 0.12.13

* PR #150, Issue #143. Leaking sockets when connection fails

## 0.12.12

* PR #149. Make withConnect friendly to transformer stack

## 0.12.11

* Expose `withCheckedConnect`, `withConnect`

## 0.12.9

* Expose the `Database.Redis.Core.Internal` module (see https://github.com/informatikr/hedis/issues/144 )

## 0.12.8

* PR #140. Added support of +/- inf redis argument

## 0.12.7

* PR #139.  fix MonadFail instance

## 0.12.6

* PR #138, Issue #137. Derive MonadFail for the Redis monad

## 0.12.5

Issue #136 fix slowlog parsing

## 0.12.4

* Add upper bound on network package

## 0.12.3

* Issue #135. Upper the base bound

## 0.12.2

* PR #134. Fix some asynchronous exception safety problems

## 0.12.1

* PR #133. Fixes to stream commands

## 0.12.0

* PR #130. Bring back ability to connect via a Unix Socket

## 0.11.1

* PR #129. Fix tests

## 0.11.0

* PR #126. Fixes for network 2.8 and 3.0

## 0.10.10

* Only disable warnings for GHC 8.6, fix build

## 0.10.9

* Remove deprecation warnings

## 0.10.8

* PR #121. make xgroupCreate return Status

## 0.10.7

* PR #121. Fix streaming on redis 5.0.2
* PR #121. Get rid of slave-thread

## 0.10.6

* PR #120. Add withConnect, withCheckedConnect

## 0.10.5

* PR #XXX Fix CI builds with updated Redis version

## 0.10.4

* PR #112. Implement streams commands

## 0.10.3

* PR #110. Add disconnect which destroys all (idle) resources in the pool

## 0.10.2

* PR #108. Add TLS support

## 0.10.1

* PR #104. Add a Semigroup instance (fix GHC 8.4)

## 0.10.0

* PR #102. Return list from srandmemberN
* PR #103. Add spopN
* PR #101. Add parseConnectInfo
* PR #100, Issue #99. Throw error when AUTH or SELECT fails on connect

## 0.9.12

* PR #98. Added `connectTimeout` option

## 0.9.11

* PR #94. Refactor fix for issue #92 - (Connection to Unix sockets is broken)

## 0.9.10

* PR #93, Issue #92. Connection to Unix sockets is broken

## 0.9.9

* PR #90. set SO_KEEPALIVE option on underlying connection socket

## 0.9.8

* Fix syntax errors from redis when using scanOpts to specify match
  pattern or count options (see PR #88)

## 0.9.7

* Expose returnDecode method of RedisCtx (see issue #83)

## 0.9.6

* Export Condition constructors (see PR #86)

## 0.9.2

* Added multithreaded pub/sub message processing (see PR #77)

## 0.9.0

* Merge in a fresh commands.json and a set of new commands
  implemented. See PR #52 for more info

## 0.8.3

* Export MonadRedis methods

## 0.8.1

* Export unRedis/reRedis internalish functions which let you define
  MonadCatch instance easily (see PR #73)

## 0.8.0

* Major speed improvement by using non-backtracking parser (PR #69)

## 0.7.10

* Improved performance (PR #64)

## 0.7.7

* Close connection handle on error

## 0.7.2

* Improve speed, rewrite internal logic (PR #56)

## 0.7.1

* Add NFData instances

## 0.7.0

* Enforce all replies being recieved in runRedis. Pipelining between runRedis
  calls doesn't work now.

## 0.6.10

* Add HyperLogLog support

## 0.6.4

* New connection option to automatically SELECT a database.

## 0.5 -> 0.6

* Changed return type of HDEL from Bool to Integer.
* Some documentation updates.

## 0.5 -> 0.5.1

* New commands: DUMP, RESTORE, BITOP, BITCOUNT.
* Removed the dependency on stm.
* Improved performance of Queued in long transactions.
* Minor documentation updates.


## 0.4.1 -> 0.5

* Added new Redis 2.6 commands, including Lua scripting support.
* A transaction context is now created by using the 'multiExec' function.
  The functions 'multi', 'exec' and 'discard' are no longer available
  individually.
* Inside of a transaction, commands return their results wrapped in a
  composable /future/, called 'Queued'.
* The 'getType' command (the Redis TYPE command) now has a custom return
  type 'RedisType'.
* Minor improvements and fixes to the documentation.


## 0.3.2 -> 0.4.1

* The following commands got a 'Maybe' added to their return type, to
  properly handle Redis returning `nil`-replies: `brpoplpush`, `lindex`, `lpop`,
  `objectEncoding`, `randomkey`, `rpop`, `rpoplpush`, `spop`, `srandmember`,
  `zrank`, `zrevrank`, `zscore`.
* Updated dependencies on `bytestring-lexing` and `stm`.
* Minor improvements and fixes to the documentation.
