# Changelog `relude` uses [PVP Versioning][1]. The changelog is available [on GitHub][2]. ## 1.0.0.0 — Mar 12, 2021 * [#353](https://github.com/kowainik/relude/issues/353): Reexport most common modules from the following libraries: + `containers` + `unordered-containers` + `text` + `bytestring` Now, when using `relude`, you don't need to add these libraries to your `.cabal` file to enjoy their main API. Try removing them from your `.cabal` file after upgrading to this version of `relude` to see if you still need them. To utilise this feature, update the `mixin` part of your package configuration (if you're using the mixins approach) to the following: ```cabal mixins: base hiding (Prelude) , relude (Relude as Prelude) , relude ``` * [#345](https://github.com/kowainik/relude/issues/345): Support GHC-9.0. * Upgrade minor GHC versions to GHC-8.10.4 and GHC-8.8.4. * [#268](https://github.com/kowainik/relude/issues/268): Drop support of GHC-8.0.2. * [#270](https://github.com/kowainik/relude/issues/270): Standardise `universe`, `universeNonEmpty` and `inverseMap` functions that previously were introduced in the `Relude.Extra.Enum` module. `Relude.Enum` module created that is exported in the main `Relude` module by default. __Migration guide:__ If you were using any of these functions you can now remove `Relude.Extra.Enum` from your imports and explicit `mixins` section as they are available for you with the `Relude` module. * Remove the `Eq` constraint on `universeNonEmpty` * [#269](https://github.com/kowainik/relude/issues/269): Remove the `Relude.Extra.Validation` module. __Migration guide:__ If you use `Relude.Extra.Validation` in you project you need to: 1. Add `validation-selective` into the `build-depends` section of your `.cabal` file. 2. Change imports of `Relude.Extra.Validation` to `Validation`: ```haskell -- Was: import Relude.Extra.Validation (Validation (..), ..) -- Became: import Validation (Validation (..), ..) ``` * [#346](https://github.com/kowainik/relude/issues/346), [#347](https://github.com/kowainik/relude/issues/347): Reimplement `ordNub` through `nubOrd` from `containers`. Add `ordNubOn`, `intNub` and `intNubOn` functions. * [#327](https://github.com/kowainik/relude/issues/327): Add `infinitely` as more strictly typed `forever`. * [#311](https://github.com/kowainik/relude/issues/311): Add `maybeAt` function — the non-operator version of `!!?` with its arguments flipped. * [#314](https://github.com/kowainik/relude/issues/314): Add lifted versions of functions to work with `Handle`: + `hFlush` + `hIsEOF` + `hSetBuffering` + `hGetBuffering` * [#305](https://github.com/kowainik/relude/issues/305): Add lifted versions of functions to work with environment: + `getArgs` + `lookupEnv` * Add lifted version of the `readFile'` function. * Reexport the `BufferMode` type from `base`. * [#309](https://github.com/kowainik/relude/issues/309): Reexport `span` from `Data.List`. * [#319](https://github.com/kowainik/relude/issues/319): Implement `partitionWith`. * [#307](https://github.com/kowainik/relude/issues/307): Add `foldr1` to `Foldable1`. * [#316](https://github.com/kowainik/relude/issues/316): Add `average` and `average1` — efficient functions for finding average on foldable structures. * [#306](https://github.com/kowainik/relude/issues/306): Add `maximumOn1` and `minimumOn1` to `Foldable1`. * [#301](https://github.com/kowainik/relude/issues/301): Add `traceShowWith` to `Relude.Debug`. * [#304](https://github.com/kowainik/relude/issues/304), [#317](https://github.com/kowainik/relude/issues/317): Various documentation improvements. * Updates to `relude`-specific `.hlint` rules. Thanks @googleson78, @sushi-shi, @rektrex, @aleator, @mjgpy3, @dalpd, @Bodigrim for helping with this release! ## 0.7.0.0 — May 14, 2020 * [#253](https://github.com/kowainik/relude/issues/253): Support GHC-8.10. Upgrade GHC-8.8 to 8.8.3. * Significant documentation improvements: + Add high-level description to each reexported module. + Add String Conversion Table. + Add `NonEmpty` lists functions tables. + Add `@since` annotations. + Improve README. + Inline some external reexports into explicit lists of exports. + Rewrite top-level `cabal` description. * [#234](https://github.com/kowainik/relude/issues/234): Reexport `scanl1`, `scanr1`, `scanl'` from `Data.List`. * [#256](https://github.com/kowainik/relude/issues/256): Make `cycle` total function. * [#233](https://github.com/kowainik/relude/issues/233): Add `etaReaderT` to `Relude.Monad.Trans` to help with performance. * [#294](https://github.com/kowainik/relude/issues/294): Add `atomicModifyIORef_` and `atomicModifyIORef'_`. * [#293](https://github.com/kowainik/relude/issues/293): Add `memptyIfFalse` and `memptyIfTrue` functions. * Reexport `NonEmpty` functions from `Relude.List.NonEmpty` instead of `Relude.List.Reexport`. * [#239](https://github.com/kowainik/relude/issues/239): Reexport more STM functions that work with `TMVar` from `Relude.Lifted.Concurrent`. * [#227](https://github.com/kowainik/relude/issues/227): Create `Relude.Extra` module * [#228](https://github.com/kowainik/relude/issues/228): Add `universeNonEmpty` function. * [#249](https://github.com/kowainik/relude/issues/249): __Breaking change:__ Fix infix of the `Relude.Extra.Lens` `(^.)` operator. Change it to `infixl 8`. * Reexport partial `read` from `Relude.Unsafe` for consistency. * [#244](https://github.com/kowainik/relude/issues/244): Remove deprecated functions: `prec`, `dupe` and `mapBoth`. __Migration rules:__ + `prec`: use `prev` instead + `dupe`: use `dup` instead + `mapBoth`: use `bimapBoth` instead * [#246](https://github.com/kowainik/relude/issues/246): Deprecate `Relude.Extra.Validation` in favour of [`validation-selective`](https://hackage.haskell.org/package/validation-selective) __Migration rules:__ If you use `Relude.Extra.Validation` in you project you need to: 1. Add `validation-selective` into the `build-depends` section of your `.cabal` file. 2. Change imports of `Relude.Extra.Validation` to `Validation`: ```haskell -- Was: import Relude.Extra.Validation (Validation (..), ..) -- Became: import Validation (Validation (..), ..) ``` * [#196](https://github.com/kowainik/relude/issues/196): Deprecate `mapToFst` and `mapToSnd`. Introduce `toFst` and `toSnd` in `Relude.Extra.Tuple` as shorter aliases for `mapToFst`. Implement `fmapToFst` and `fmapToSnd`. Add more HLint rules for `Relude.Extra.Tuple` functions. __Migration rules:__ + Replace `mapToFst` with `toFst` + Replace `mapToSnd` with `toSnd` + You can now use `fmapToFst` and `fmapToSnd` instead of `[f]map (mapToFst f)` and `[f]map (mapToSnd f)` * [#286](https://github.com/kowainik/relude/issues/286): __Breaking change:__ `readEither` is not polymorphic over the first argument anymore. Now it takes `String`. __Migration rules:__ Use one of the conversion function from the `Relude.String.Conversion` module to covert your old input value into `String`. For example, if you had ```haskell readEither @Text @Int myText ``` Now it should become: ```haskell readEither @Int (toString myText) ``` * [#281](https://github.com/kowainik/relude/issues/281): Move `One` property tests from `doctest` to `hedgehog`. Significant test time boost. * [#264](https://github.com/kowainik/relude/issues/264): Support Dhall-16.0.0 in HLint rules. ## 0.6.0.0 — Oct 30, 2019 * [#171](https://github.com/kowainik/relude/issues/171): Add custom type errors to various functions and instances. + `head`, `tail`, `last`, `init` + `words`, `unwords`, `lines`, `unlines` + `error` + `ToText`, `ToLText`, `ToString` instances for bytestrings + `Foldable1` instance for ordinary lists + `Monad` instance for `Validation` (by [@vrom911](https://github.com/vrom911), [@chshersh](https://github.com/chshersh)) * [#164](https://github.com/kowainik/relude/issues/164): Reexport `ShortByteString`, `toShort`/`fromShort` functions. (by [@vrom911](https://github.com/vrom911)) * [#182](https://github.com/kowainik/relude/issues/182): Support GHC-8.8.1. (by [@chshersh](https://github.com/chshersh)) * [#168](https://github.com/kowainik/relude/pull/168), [#197](https://github.com/kowainik/relude/pull/197): Improve documentation significantly (more and better examples, better wording). (by [@chshersh](https://github.com/chshersh), [@vrom911](https://github.com/vrom911), [@Cmdv](https://github.com/Cmdv)) * [#177](https://github.com/kowainik/relude/issues/177): Improve usage of performance pragmas. (by [@chshersh](https://github.com/chshersh)) * [#167](https://github.com/kowainik/relude/issues/167): Rename functions (and deprecate old versions): + `prec` to `prev` + `dupe` to `dup` (by [@Cmdv](https://github.com/Cmdv), [@chshersh](https://github.com/chshersh)) * [#192](https://github.com/kowainik/relude/issues/192): Reexport `foldMap'` from `Data.Foldable`. (by [@tfausak](https://github.com/tfausak)) * [#201](https://github.com/kowainik/relude/issues/201): Implement `!!?` as a safe equivalent of `!!` that returns a `Maybe`. (by [@kutyel](https://github.com/kutyel)) * [#203](https://github.com/kowainik/relude/issues/203): Implement the `guarded` combinator. (by [@JonathanLorimer](https://github.com/JonathanLorimer)) * [#214](https://github.com/kowainik/relude/issues/214): Add `mapMaybeM` function. (by [@vrom911](https://github.com/vrom911)) * [#174](https://github.com/kowainik/relude/issues/174): Implement `bimapBoth` in `Relude.Extra.Tuple` module, mark `mapBoth` as DEPRECATED. (by [@astynax](https://github.com/astynax)) * [#221](https://github.com/kowainik/relude/issues/221): Improve documentation for the `Validation` module significantly. (by [@chshersh](https://github.com/chshersh)) * [#176](https://github.com/kowainik/relude/issues/176): Implement property-based tests for `Validation` laws. (by [@astynax](https://github.com/astynax)) * [#172](https://github.com/kowainik/relude/issues/172): Add `Monoid` and `Semigroup` instances for the `Validation` type. (by [@mauriciofierrom](https://github.com/mauriciofierrom)) * [#156](https://github.com/kowainik/relude/issues/156): Implement helper type-level functions in `Relude.Extra.Type`. (by [@TheMatten](https://github.com/TheMatten)) * [#170](https://github.com/kowainik/relude/issues/170): Implement `Elem` type family. (by [@kutyel](https://github.com/kutyel)) * [#165](https://github.com/kowainik/relude/pull/165): Re-export `GHC.Float.atan2`. (by [@ethercrow](https://github.com/ethercrow)) * [#155](https://github.com/kowainik/relude/issue/155): Implement `foldlSC` — short-circuting list fold — in `Relude.Extra.Foldable`. (by [@josephcsible](https://github.com/josephcsible)) * [#158](https://github.com/kowainik/relude/issue/158): Support GHC-8.6.5. (by [@chshersh](https://github.com/chshersh)) * [#148](https://github.com/kowainik/relude/issues/148): Migrate HLint rules to the latest Dhall spec. (by [@vrom911](https://github.com/vrom911)) * [#178](https://github.com/kowainik/relude/issues/178): Made `die` be polymorphic in its return type. (by [@ilyakooo0](https://github.com/ilyakooo0)) * [#162](https://github.com/kowainik/relude/pull/162), [#189](https://github.com/kowainik/relude/pull/189), [#190](https://github.com/kowainik/relude/pull/190), [#191](https://github.com/kowainik/relude/pull/191), [#193](https://github.com/kowainik/relude/pull/193), [#194](https://github.com/kowainik/relude/pull/194), [#195](https://github.com/kowainik/relude/pull/195): Various refactorings and code improvements: + __Breaking change:__ Reorder type parameters to `asumMap` + Implement `andM`, `orM`, `allM`, and `anyM` in terms of `&&^` and `||^` + Use `foldr` instead of explicit recursion and `toList` + Use `mapToFst` instead of `zip` to improve list fusion in `inverseMap` + Implement `foldMap1` for `NonEmpty` in terms of `foldr` + Use `$>` instead of `*>` and `pure` where possible + Implement `asumMap` and `foldMapA` by coercing `foldMap` + Return Failure early in `<*` and `*>` too (by [@josephcsible](https://github.com/josephcsible)) * [#187](https://github.com/kowainik/relude/issues/187): Remove `tasty` and `tasty-hedgehog` dependencies and their redundant imports. (by [@dalpd](https://github.com/dalpd)) ## 0.5.0 — Mar 18, 2019 * [#127](https://github.com/kowainik/relude/issues/127): Implement `Relude.Extra.Lens` module. * [#125](https://github.com/kowainik/relude/issues/125): Moved many numerical functions and types in `Relude.Numeric`. Reexport `toIntegralSized` from `Data.Bits`. Add `integerToBounded` and `integerToNatural` in `Relude.Numeric`. * [#121](https://github.com/kowainik/relude/issues/121): Reexport `Ap` from `Data.Monoid`. Change definition of `foldMapA` to use `Ap`. * [#129](https://github.com/kowainik/relude/issues/129): Add `appliedTo` and `chainedTo` as named versions of operators `=<<` and `<**>`. * [#138](https://github.com/kowainik/relude/issues/138): Add `RealFloat` to `Relude.Numeric`. * [#144](https://github.com/kowainik/relude/issues/144): Add `traverseToSnd` and friends to `Relude.Extra.Tuple`. * [#140](https://github.com/kowainik/relude/issues/140): Improve text of custom compile-time error messages for `elem` functions. * [#136](https://github.com/kowainik/relude/issues/136): Cover `Relude.Extra.*` modules with custom HLint rules. * [#146](https://github.com/kowainik/relude/issues/146): Improve documentation for `Relude.File` file: be more explicit about system locale issues. * Improve documentation for `One` typeclass and add tests. * Support ghc-8.6.4 and ghc-8.4.4. Drop support for ghc-8.6.1 and ghc-8.4.3. ## 0.4.0 — Nov 6, 2018 * [#70](https://github.com/kowainik/relude/issues/70): Reexport `Contravariant` for GHC >= 8.6.1. * [#103](https://github.com/kowainik/relude/pull/104): Drop `utf8-string` dependency and improve performance of conversion functions. * [#98](https://github.com/kowainik/relude/issues/98): Reexport `Bifoldable` related stuff from `base`. * [#99](https://github.com/kowainik/relude/issues/99): Reexport `Bitraversable` related stuff from `base`. * [#100](https://github.com/kowainik/relude/issues/100): Add `Relude.Extra.Validation` with `Validation`data type. * [#89](https://github.com/kowainik/relude/issues/89): Add `Relude.Extra.Type` module containing a `typeName` function. * [#92](https://github.com/kowainik/relude/issues/92) Add `Relude.Extra.Tuple` module, containing `dupe`, `mapToFst`, `mapToSnd`, and `mapBoth` functions. * [#97](https://github.com/kowainik/relude/issues/97): Add `(&&^)` and `(||^)` operators. * [#81](https://github.com/kowainik/relude/issues/81): Add `asumMap` to `Foldable` functions. * [#80](https://github.com/kowainik/relude/issues/80): Add hlint rules for `whenLeft`, `whenLeftM`, `whenRight` and `whenRightM`. * [#79](https://github.com/kowainik/relude/issues/79): Add HLint rules for `One` typeclass. * Remove `openFile` and `hClose`. * [#83](https://github.com/kowainik/relude/pull/83): Make documentation for `nub` functions prettier. * [#109](https://github.com/kowainik/relude/issues/109): Use Dhall v3.0.0 for hlint file generation. ## 0.3.0 * [#41](https://github.com/kowainik/relude/issues/41): Add `Foldable1`. * [#63](https://github.com/kowainik/relude/issues/63): Remove `Print` typeclass. Add `put[L]BS[Ln]` functions. `trace` functions now take `String` as argument instead of `Text`. **Important:** this is a breaking change. If you used polymorphic `putStrLn` you need to remove type application or switch to one of the monomorphic functions. Also, you can't abstract over `Print` typeclass anymore. * [#66](https://github.com/kowainik/relude/issues/66): Export `(>>>)` and `(<<<)` from `Control.Category`. * [#59](https://github.com/kowainik/relude/issues/59): Introduce `flap` function and its operator version `??`. * [#64](https://github.com/kowainik/relude/issues/64): Improve performance of functions from `Foldable1`. Add `foldl1'` function. * Reexport `uncons` from `base`. * Rewrite `die` implementation to use `die` from `base`. * [#19](https://github.com/kowainik/relude/issues/19): Rewrite `.hlint.yaml` to Dhall. * Move `stdin`- and `stdout`-related functions to new module `Relude.Lifted.Terminal`. * [#67](https://github.com/kowainik/relude/issues/67): Add HLint rules for `put*` functions. * [#22](https://github.com/kowainik/relude/issues/22): `readFile`, `writeFile` and `appendFile` now work with `String`. Add lifted version of `hClose`. Add `readFile`, `writeFile` and `appendFile` alternatives for `Text` and `ByteString`. * [#61](https://github.com/kowainik/relude/issues/61): Add `under2` and `underF2` functions to `Relude.Extra.Newtype`. * [#60](https://github.com/kowainik/relude/issues/60): Add `hoistMaybe` and `hoistEither` functions. ## 0.2.0 * [#43](https://github.com/kowainik/relude/issues/43): Implement `Relude.Extra.Newtype` module. * [#46](https://github.com/kowainik/relude/issues/46): Add a function that returns its own name. * [#48](https://github.com/kowainik/relude/issues/48): Export `<&>` from `base`. Also reexport `fromLeft` and `fromRight` from `base` where possible. * [#49](https://github.com/kowainik/relude/issues/49): Speed up and refactor property tests. * [#54](https://github.com/kowainik/relude/issues/54): Improve documentation. Add more examples to documentation and more tests. Reexport `withReader` and `withReaderT`. Remove `safeHead`. Rename `Relude.List.Safe` to `Relude.List.NonEmpty`. ## 0.1.1 * [#44](https://github.com/kowainik/relude/issues/44): Implement parser deriviation from pretty-printers. ## 0.1.0 * [#7](https://github.com/kowainik/relude/issues/7): Remove `Container.Class.Container`. Export `Foldable`. * [#2](https://github.com/kowainik/relude/issues/2): Remove `microlens` from dependencies. * [#10](https://github.com/kowainik/relude/issues/10): Remove `VarArg` module. * [#9](https://github.com/kowainik/relude/issues/9): Remove `safe-exceptions` from dependencies. Reexport `Exception` and `SomeException` from `Control.Exception` instead. * [#11](https://github.com/kowainik/relude/issues/11): Remove `TypeOps` module and `type-operators` dependency. * [#13](https://github.com/kowainik/relude/issues/13): Remove `list`, `getContents`, `interact`, `getArgs`, `note` functions. Remove `Lifted.ST` module. Rename `Lifted.Env` to `Lifted.Exit`. * [#16](https://github.com/kowainik/relude/issues/16): Rename `whenLeft`, `whenRight`, `whenLeftM`, `whenRightM` to `whenLeft_` and `whenRight_`, `whenLeftM_` and `whenRightM_`. Add `whenLeft`, `whenRight`, `whenLeftM`, `whenRightM` which return the value. * [#18](https://github.com/kowainik/relude/issues/18): Add `LazyStrict` type class for conversions. * `map` is not `fmap` anymore. Reexport `map` from `Data.List` * [#12](https://github.com/kowainik/relude/issues/12): Remove `liquid-haskell` support. * [#20](https://github.com/kowainik/relude/issues/20): Add `viaNonEmpty` function. * [#21](https://github.com/kowainik/relude/issues/21): Add `MonadFail` instance for `Either`. * [#17](https://github.com/kowainik/relude/issues/17): Add `foldMapA` and `foldMapM` functions. * [#4](https://github.com/kowainik/relude/issues/4): Rename package to `Relude`. * [#14](https://github.com/kowainik/relude/issues/14): Add `Relude.Extra.*` modules which are not exported by default but have useful functions. * [#8](https://github.com/kowainik/relude/issues/8): Introduce `StaticMap` and `DynamicMap` type classes as universal interface for Map-like structures. [1]: https://pvp.haskell.org [2]: https://github.com/kowainik/relude/releases