universum
Custom prelude used in Serokell
https://github.com/serokell/universum
| LTS Haskell 23.28: | 1.8.2.2 | 
| Stackage Nightly 2025-11-04: | 1.8.3 | 
| Latest on Hackage: | 1.8.3 | 
universum-1.8.3@sha256:9e8d5017635f922e4b7c3ba240d6f2b4b91a31b6989a796659b57a30feb17191,6682Module documentation for 1.8.3
- Universum
- Universum.Applicative
 - Universum.Base
 - Universum.Bool
 - Universum.Container
 - Universum.Debug
 - Universum.DeepSeq
 - Universum.Exception
 - Universum.Function
 - Universum.Functor
 - Universum.Lifted
 - Universum.List
 - Universum.Monad
 - Universum.Monoid
 - Universum.Nub
 - Universum.Print
 - Universum.String
 - Universum.TypeOps
 - Universum.Unsafe
 - Universum.VarArg
 
 
Universum
universum is a custom prelude used in @Serokell that has:
- Excellent documentation: tutorial, migration guide from 
Prelude, Haddock with examples for (almost) every function, all examples are tested withdoctest, documentation regarding internal module structure. universum-specific HLint rules:.hlint.yaml- Focus on safety, convenience and efficiency.
 
What is this file about?
This README contains introduction to Universum and a tutorial on how to use it.
Structure of this tutorial
This tutorial has several parts:
- Philosophy and motivation.
 - How to use 
universum. - Changes in 
Prelude(some gotchas). - Already known things that weren’t in 
Preludebrought into scope. - New things added.
 - Migration guide from 
Prelude. 
This is neither a tutorial on Haskell nor tutorial on each function contained in Universum. For detailed documentation of every function together with examples and usage, see Haddock documentation.
Why another custom Prelude? ↑
Motivation
At Serokell, we strive to be as productive as possible. That’s why we are using Haskell. This choice of language implies
that we’re restricted to use Prelude:
implicit import of basic functions, type classes and data types. Unfortunately, the default Prelude
is considered to be not so good
due to some historical reasons.
This is why we decided to use a better tool. Luckily, Haskell provides us with the ability
to replace default Prelude with an alternative. All we had to do is to implement a
new basic set of defaults. There already were plenty of preludes,
so we didn’t plan to implement everything from scratch.
After some long, hot discussions, our team decided to base our custom prelude on
protolude.
The next section explains why we’ve made this choice and what we are willing to do.
This tutorial doesn’t cover the differences from protolude. Instead, it explains how Universum is different from regular Prelude.
Main goals
While creating and maintaining a custom prelude, we are pursuing the following goals:
- Avoid all partial functions.
We like total and exception-free functions.
You can still use some unsafe functions from 
Universum.Unsafemodule, but they are not exported by default. - Use more efficient string representations.
Stringtype is crushingly inefficient. All our functions either try to be polymorphic over string type or useTextas the default string type. Because the community is evolving slowly, some libraries still useStringtype, soStringtype alias is still reexported. We recommend to avoidStringas much as you can! - Try to not reinvent the wheel. We’re not trying to rebuild whole type hierarchy from scratch,
as it’s done in 
classy-prelude. Instead, we reexport common and well-known things frombaseand some other libraries that are used in everyday production programming in Haskell.Note: well, we did end up inventing some new things.
 - Export more useful and commonly used functions.
Things like 
liftIO,ReaderTtype,MVar-related functions have unambiguous names, are used in almost every non-trivial project, and it’s really tedious to import them manually every time. - Make changes only when there are enough good reasons to make these changes. We have a code modification policy which semi-formally describes pre-conditions for different types of changes.
 
Unlike protolude, we are:
- Not trying to be as general as possible (thus we don’t export much from
GHC.Generics). - Not trying to maintain every version of 
ghccompiler (but at least the latest 3). - Trying to make writing production code easier (see enhancements and fixes).
 
How to use Universum ↑
Okay, enough philosophy. If you want to just start using universum and
explore it with the help of compiler, set everything up according to the instructions below.
Disable the built-in prelude at the top of your file:
{-# LANGUAGE NoImplicitPrelude #-}
Or directly in your project .cabal file, if you want to use in every module by default:
default-extensions: NoImplicitPrelude
Then add the following import to your modules:
import Universum
If you’re using Emacs and don’t want to
type import Universum manually every time, you can
modify your configs
a little bit.
If you want to get familiar with universum internal structure, you can just
read top-level documentation for
Universum
module.
Gotchas ↑
head,tail,last,init,foldl1,minimumand other were-partial functions work withNonEmpty ainstead of[a].- Safe analogue for 
head,foldl1,foldr1,minimum,maximumfunctions, for instance:safeHead :: [a] -> Maybe a. undefinedtriggers a compiler warning, which is probably not what you want. Either usethrowIO,Except,errororbug.mapisfmapnow.- Multiple sorting functions are available without imports:
sortBy :: (a -> a -> Ordering) -> [a] -> [a]: sorts list using given custom comparator.sortWith :: Ord b => (a -> b) -> [a] -> [a]: sorts a list based on some property of its elements.sortOn :: Ord b => (a -> b) -> [a] -> [a]: just likesortWith, but more time-efficient if function is calculated slowly (though less space-efficient). So you should writesortOn length(would sort elements by length) butsortWith fst(would sort list of pairs by first element).
 - Functions 
sumandproductare strict now, which makes them more efficient. - If you try to do something like 
putStrLn "hi", you’ll get an error message ifOverloadedStringsis enabled – it happens because the compiler doesn’t know what type to infer for the string. UseputTextLnin this case. - Since 
showdoesn’t come fromShowanymore, you can’t writeShowinstances easily. See migration guide for details. - You can’t call some 
Foldablemethods overMaybeand some other types.Foldablegeneralization is useful but potentially error-prone. Instead we created our own fully compatible withFoldableContainertype class but that restricts the usage of functions likelengthoverMaybe,Either,Identityand tuples. We’re also using GHC 8 feature of custom compile-time errors to produce more helpful messages. - As a consequence of previous point, some functions like 
traverse_,forM_,sequenceA_, etc. are generalized overContainertype classes. errortakesText.- We are exporting a rewrite rule which replaces 
toString . toText :: Text -> Textwithid. Note that this changes semantics in some corner cases. 
Things that you were already using, but now you don’t have to import them explicitly ↑
Commonly used libraries
First of all, we reexport some generally useful modules: Control.Applicative,
Data.Traversable, Data.Monoid, Control.DeepSeq, Data.List, and lots of others.
Just remove unneeded imports after importing Universum (GHC should tell you which ones).
Then, some commonly used types: Map/HashMap/IntMap, Set/HashSet/IntSet, Seq, Text and ByteString
(as well as synonyms LText and LByteString for lazy versions).
liftIO and MonadIO are exported by default. A lot of IO functions are generalized to MonadIO.
deepseq is exported. For instance, if you want to force deep evaluation of some value (in IO),
you can write evaluateNF a. WHNF evaluation is possible with evaluateWHNF a.
We also reexport big chunks of these libraries: mtl, stm, microlens, microlens-mtl.
Bifunctor
type class with useful instances is exported.
firstandsecondfunctions apply a function to first/second part of a tuple (for tuples).bimaptakes two functions and applies them to first and second parts respectively.
Text
We export Text and LText, and some functions work with Text instead of String –
specifically, IO functions (readFile, putStrLn, etc) and show. In fact, show
is polymorphic and can produce strict or lazy Text, String, or ByteString.
Also, toText/toLText/toString can convert Text|LText|String types to Text/LText/String. If you want to convert to and from ByteString use encodeUtf8/decodeUtf8 functions.
Debugging and undefineds
trace, traceM, traceShow, etc. are available by default. GHC will warn you
if you accidentally leave them in code, however (same for undefined).
We also have data Undefined = Undefined (which, too, comes with warnings).
Exceptions
We use safe-exceptions
library for exceptions handling. Don’t import Control.Exceptions
module explicitly. Instead use functionality from safe-exceptions
provided by universum or import Control.Exceptions.Safe module.
What’s new? ↑
Finally, we can move to part describing the new cool features we bring with universum.
- 
unconssplits a list at the first element. - 
ordNubandsortNubare O(n log n) versions ofnub(which is quadratic) andhashNubandunstableNubare almost O(n) versions ofnub. - 
(&)– reverse application.x & f & ginstead ofg $ f $ xis useful sometimes. - 
whenM,unlessM,ifM,guardMare available and do what you expect them to do (e.g.whenM (doesFileExist "foo")). - 
Very generalized version of
concatMapM, too, is available and does what expected. - 
readMaybeandreadEitherare likereadbut total and give eitherMaybeorEitherwith parse error. - 
when(Just|Nothing|Left|Right|NotEmpty)[M][_]let you conditionally execute something. Before:case mbX of Nothing -> return () Just x -> ... x ...After:
whenJust mbX $ \x -> ... x ... - 
for_for loops. There’s alsoforM_butfor_looks a bit nicer.for_ [1..10] $ \i -> do ... - 
andM,allM,anyM,orMare monadic version of corresponding functions frombase. - 
Type operator
$for writing types likeMaybe $ Either String $ Maybe Int. - 
Eachtype family. So this:f :: Each [Show, Read] [a, b] => a -> b -> Stringtranslates into this:
f :: (Show a, Show b, Read a, Read b) => a -> b -> String - 
Withtype operator. So this:a :: With [Show, Read] a => a -> atranslates into this:
a :: (Show a, Read a) => a -> a - 
Variadic composition operator
(...). So you can write:ghci> (show ... (+)) 1 2 "3" ghci> show ... 5 "5" ghci> (null ... zip5) [1] [2] [3] [] [5] True ghci> let process = map (+3) ... filter ghci> process even [1..5] [5,7] - 
Conversions between
EitherandMaybelikerightToMaybeandmaybeToLeftwith clear semantic. - 
using(Reader|State)[T]functions as aliases forflip run(Reader|State)[T]. - 
Onetype class for creating singleton containers. Even monomorhpic ones likeText. - 
evaluateWHNFandevaluateNFfunctions as clearer and lifted aliases forevaluateandevaluate . force. - 
ToPairstype class for data types that can be converted to list of pairs (likeMaporHashMaporIntMap). 
Migration guide from Prelude ↑
In order to replace default Prelude with universum you should start with instructions given in
how to use universum section.
This section describes what you need to change to make your code compile with universum.
- 
Enable
-XOverloadedStringsand-XTypeFamiliesextension by default for your project. - 
Since
head,tail,minimumand some other functions work forNonEmptyyou should refactor your code in one of the multiple ways described below:- Change 
[a]toNonEmpty awhere it makes sense. - Use functions which return 
Maybe. They can be implemented usingnonEmptyfunction. Likehead <$> nonEmpty l.head <$> nonEmpty lissafeHead ltailisdrop 1. It’s almost never a good idea to usetailfromPrelude.
 - Add 
import qualified Universum.Unsafe as Unsafeand replace function with qualified usage. 
 - Change 
 - 
If you use
fromJustor!!you should use them fromimport qualified Universum.Unsafe as Unsafe. - 
Derive or implement
Containerinstances for your data types which implementFoldableinstances. This can be done in a single line becauseContainertype class automatically derives fromFoldable. - 
Containertype class fromuniversumreplacesFoldableand doesn’t have instances forMaybe a,(a, b),Identity aandEither a b. If you usefoldrorforM_or similar for something likeMaybe ayou should replace usages of such function with monomorhpic alternatives:- 
Maybe(?:) :: Maybe a -> a -> afromMaybe :: a -> Maybe a -> amaybeToList :: Maybe a -> [a]maybeToMonoid :: Monoid m => Maybe m -> mmaybe :: b -> (a -> b) -> Maybe a -> bwhenJust :: Applicative f => Maybe a -> (a -> f ()) -> f ()whenJustM :: Monad m => m (Maybe a) -> (a -> m ()) -> m ()
 - 
EitherfromLeft :: a -> Either a b -> afromRight :: b -> Either a b -> beither :: (a -> c) -> (b -> c) -> Either a b -> cwhenRight :: Applicative f => Either l r -> (r -> f ()) -> f ()whenRightM :: Monad m => m (Either l r) -> (r -> m ()) -> m ()
 
 - 
 - 
If you have types like
foo :: Foldable f => f a -> a -> ayou should chose one of the following:Right: Modify types forContainerlikefoo :: (Container t, Element t ~ a) => t -> a -> a.Left: ImportData.Foldablemodulequalifiedand use everythingFoldable-related qualified.
 - 
Forget about
Stringtype.- Replace 
putStrandputStrLnwithputTextandputTextLn. - Replace 
(++)with(<>)forString-like types. - Try to use 
fmtlibrary if you need to construct messages. - Use 
toText/toLText/toStringfunctions to convert toText/LazyText/Stringtypes. - Use 
encodeUtf8/decodeUtf8to convert to/fromByteString. 
 - Replace 
 - 
Run
hlintusing.hlint.yamlfile fromuniversumpackage to cleanup code and imports. - 
Since vanilla
showfrom theShowclass is not available, your customShowinstances will fail to compile. You canimport qualified Text.Showto bring vanillashowto scope with qualified name. It will not conflict withshowfromuniversumand yourShowinstances will compile successfully. 
Changes
1.8.3
1.8.2.2
- #297
- Add support for GHC-9.10 without any user-visible changes.
 
 
1.8.2.1
- #293
- Add explicit kind signatures for custom operators.
 - Bump some dependency constraints to support GHC-9.8.
 
 
1.8.2
- #289:
Make universum work with LTS-21.0.
- Re-export 
(~)type operator. 
 - Re-export 
 - #283:
Bump the upper version bound on 
textto2.0.2. 
1.8.1.1
- #282:
Bump the upper version bound on 
textto2.0.1. 
1.8.1
- #271: Add compatibility with tasty-hedgehog 1.2.0.0
 
1.8.0
- 
#252: Remove
Optionre-export. UseMaybeinstead. - 
#176: Deprecate
note. - 
#206: Remove
listToMaybe. Migration guide: usesafeHeaddirectly with functions fromUniversum.Containerinstead. - 
#182: Deprecate
microlensandmicrolens-mtldependencies. - 
#165: Change the type of
readMaybefromreadMaybe :: Read a => String -> Maybe ato it’s polymorphic versionreadMaybe :: forall b a. (ToString a, Read b) => a -> Maybe b. - 
#199: Change type of
concatMapfromconcatMap :: Foldable f => (a -> [b]) -> t a -> [b]toconcatMap :: Container c => (Element c -> [b]) -> c -> [b]. - 
250: Replace
groupexport fromData.Listwithgroup,groupBy,groupWithandgroupAllWithfromData.List.NonEmpty. 
1.7.3
- 
#236: Add
updateMVar'andupdateTVar'. - 
#244 Add
ToPairsinstances for[(k, v)]andNonEmpty (k, v). - 
#238: Add
fromList. 
1.7.2 (rev1)
- Permit 
text-1.2.5.0. 
1.7.2
- Permit 
text-1.2.4.1. - #233:
Add 
someNE. 
1.7.1
1.7.0
- #221:
Add safe versions of 
minimum,maximum,minimumBy,maximumBy,foldr1,foldl1functions forNonEmptylist. Old their versions fromContainertypeclass now returnMaybeand havesafeprefix in name (e.g.safeMinimum). Add unsafe versions of those functions toUnsafemodule. - #185: Enable more warnings, fix all warnings.
 
1.6.1
- #219:
Bump upper bound on 
text. 
1.6.0
- 
#207: Remove various monad transformer combinators,
flipfoldl', and<<$>>from the list of changes suggested in.hlint.yaml. - 
#214: Update supported GHC versions (replace 7.10.3 with 8.6.5).
 - 
#212 Added rewrite rule for
toString . toTextcase. This may change semantics in some corner cases (becausetoString . toTextis not strictly the identity function). - 
#215: Fix docstrings in
Universum.Lifted.Fileto mention correct module when referencing related functions. 
1.5.0
- 
Make
error’s stacktrace exclude site of theerrorfunction itself. - 
#200: Implemented a lifted version of
withFileand addedhClosetoUniversum.Lifted.Fileas discussed previously in #186. - 
#204: Make
tracenon-polymorphic over text argument, addtraceIdWithandtraceShowIdWith. - 
#197
hPutStr,hPutStrLnandhPrintadded toUniversum.Print. The interface for the backing typeclassUniversum.Print.Printchanged. It was also moved to the internal moduleUniversum.Print.Internaland should be considered unstable.Migration guide: The interface for the
Printclass should be considered internal and may be subject to sudden change. If you must implement your own instances, then importUniversum.Print.Internal(be aware that there are name clashes in the functions fromUniversum.PrintandUniversum.Print.Internal) - 
#201 Generalized the type of
Universum.Lifted.Env.die. Should not break existing code, apart from, perhaps, type inference. 
1.4.0
- 
#167:
identityhas been removed.Migration guide: use
Universum.idinstead. - 
#177: The
mask_reexport fromsafe-exceptionshas been removed.Migration guide: use
Control.Exception.Safe.mask_fromsafe-exceptionsinstead. - 
#178:
getArgshas been removed.Migration guide: use
liftIOdirectly withSystem.Environment.getArgsfrom base. - 
#179:
getContentsandinteracthave been removed.Migration guide: use
liftIOdirectly withData.Text.Lazy.IO.getContentsandData.Text.Lazy.IO.interact, both from thetextpackage. - 
#180: The
Lifted.STmodule has been removed.Migration guide: use
liftIOdirectly with functions fromControl.Monad.STinstead. - 
#181:
listhas been removed. 
1.3.0
- 
#167:
identityhas been deprecated.Migration guide: use
Universum.idinstead. - 
#170: Remove
ElementConstraintfrom theContainerclass.Migration guide: remove
ElementConstraintfrom every instance and every type signature. - 
#174 The
type-operatorsdependency has been removed. - 
#177: The
mask_reexport fromsafe-exceptionshas been deprecated.Migration_guide: use
Control.Exception.Safe.mask_fromsafe-exceptionsinstead. - 
#178:
getArgshas been deprecated. To be removed in a future version.Migration guide: use
liftIOdirectly withSystem.Environment.getArgsfrombase. - 
#179:
getContentsandinteracthave been deprecated.Migration guide: use
liftIOdirectly withData.Text.Lazy.IO.getContentsandData.Text.Lazy.IO.interact, both from thetextpackage. - 
#180: The
Lifted.STmodule has been deprecated. To be removed in a future version.Migration guide: use
liftIOdirectly with functions fromControl.Monad.STinstead. - 
#181:
listhas been deprecated. To be removed in a future version. 
1.2.0
- 
#159 Breaking change: Remove
text-formatdependency.Migration guide: import
Buildabletype class either fromtext-formatorformattingorfmtlibrary. There is no direct replacement forprettyandprettyLin popular libraries. You can defineprettyL = Data.Text.Lazy.Builder.toLazyText . buildandpretty = Data.Text.Lazy.toStrict. prettyL`. - 
#164: Don’t reexport
log :: Floating a => a -> a. 
1.1.1
- #148:
Add 
CODEOWNERSand contributing guide. - #135: Add documentation regarding internal module structure.
 - #113:
Annotate 
atfunction fromUnsafemodule andordNubfunction fromNubmodule withliquidhaskell. - #73: Add more examples to docs and fix warnings where possible.
 - Move reexport of 
NonEmptytoUniversum.Listmodule. 
1.1.0
- #144:
Add 
Excpattern synonym. - #60:
Reexport 
Naturaltype fromNumeric.Naturamodule. - #118:
Reexport 
TypefromData.Kindmodule. - #130:
Merge 
ToListandContainertype classes into single type classContainer. - #15:
Add 
?:function toUniversum.Monad.Maybe. - #128:
Add 
Unsafemodule with unsafe functions to works with lists andMaybe. - #129:
Reexport 
id. - #136:
Change 
foldl'type back, addflipfoldl'instead. 
1.0.4.1
- #127:
Fix 
doctestfortext-1.2.3. 
1.0.4
- #53:
Add 
doctesttouniversum. Also imporove and fix documentation. - #117:
Drop the support of 
GHC-8.0.1. - #104:
Reexport 
hashWithSaltfromData.Hashable. - #95:
Reexport 
ComposefromData.Functor.Compose. - #124:
Export methods of class 
Exception. 
1.0.3
- #114:
Reexport more functions from 
safe-exceptions. 
1.0.2
- #91:
Change argument order of 
foldl'. - #97:
Add 
ToPairstype class with the ability to have list of pairs. 
1.0.1
- #100:
Add 
bugfunction =impureThrow. 
1.0.0
- #90: Improve project structure.
 - #89:
Add export of 
Universum.Nubmodule toUniversum. - Add 
listToMaybetoUniversum.Monad.Reexport. - #81:
Make 
putTextandputLTextto be versions ofputStr. AddputTextLnandputLTextLn– versions ofputStrLn. - #5:
Add safe versions of 
head,tail,init,lastfunctions forNonEmptylist. Oldhead(which returnsMaybe) is renamed tosafeHead. Reexports fromsafeare removed. - Remove 
unsnoc(this function is very slow and shouldn’t be used). - #88:
Add 
HasCallStack =>toerrorandundefinedfunctions. - #58:
Make 
Elementtype family be associated type family. Remove{-# OVERLAPPABLE #-}instance forToListandContainer. Add default instances for basic types. RemoveWrappedListnewtypebecause it’s not needed anymore. RemoveNontrivialContainerconstraint alias. - #56:
Make 
elemandnotElemfaster forSetandHashSetby introducingElementConstraintassociated type family. - Remove 
Unsafemodule. Though, see issue #128 for disuccion regarding possible return of this module. 
0.9.1
- Change 
baseversion to be< 5. 
0.9.0
- #79: Import ‘(<>)’ from Semigroup, not Monoid.
 - Improve travis configartion.
 - #80:
Rename 
ContainertoToList,NontrivialContainertoContainer. KeepNontrivialContaineras type alias. - Rename 
Containersmodule toContainer.Class. - Move all container-related reexports from 
UniversumtoContainer.Reexport. - Add default implementation of 
nullfunction. - Add 
WrappedListnewtype with instance ofContainer. - Improve compile time error messages for disallowed instances.
 
0.8.0
- #83:
Change the order of types in 
showandprintfunctions. - Move string related reexports and functions to 
Convmodule. - Rename 
Convmodule toString. - Move 
printfunction toPrintmodule. - #77:
Add 
modify'function to export list. 
0.7.1.1
- #69:
Document 
SuperCompositionoperator(...). 
0.7.1
- #68:
Separate all ‘nub’ functions to 
Nubmodule, addsortNubandunstableNubthere. - #54: Reorganize .cabal.
 - #21: Add benchmarks.
 - #65:
Use 
TypeNatsinstead ofTypeLitswhen possible. 
0.7.0
- #47:
Reexport 
putandgetforMonadState. - #48:
Export boxed 
Vectortype. - #49:
Export 
IdentityTandrunIdentityT. - #51:
Add 
fromRightandfromLeftthat behave likefromMaybebut forEither. - #52:
Add 
maybeToMonoid :: Monoid m => Maybe m -> m. - Remove 
Symbol-related types for sure. - Return back seems to be useful function 
guardMremoved inv0.3. - Add 
notElemforNonTrivialContainer. 
0.6.1
- Fixed version number bug (it had 4 numbers).
 
0.6.0.0
- #62: Export exceptions-related functions from ‘safe-exceptions’.
 
0.5.1
- Fix an infinite loop in 
decodeUtf8fromTexttoByteString.Lazy. 
0.5
- Export 
MonadTranstypeclass. - Remove 
Symbol-related exports fromGHC.TypeLits. - Remove 
SrcLocandLocationreexports fromGHC.ExecutionStack. - Add 
Withtype operator. - Add 
hashNub. - Export strict 
StateTinstead of lazy. 
0.4.3
- Assign associativity and priority to (…), export typeclass itself.
 
0.4.2
- #25: Add vararg functions composition operator (…).
 - Rewrite 
concatMapM&concatForMso that they allow traversed and returned-by-function container types differ. 
0.4.1
- Reexport 
sortWithfromGHC.Exts. 
0.4
- Add haddock documentation with 100% coverage.
 - Rewrite README tutorial.
 - #37:
Add generalized version of 
readEither. - #38:
Add 
evaluateNF,evaluateNF_,evaluateWHNF,evaluateWHNF_. - #39:
Add lifted versions of 
IOReffunctions. - Remove 
foreach - Reexport 
(&&&)fromControl.Arrow. - Add lifted version of 
readTVarIO. interactandgetContentswork with Lazy Text.- Reexport 
MaybeT,maybeToExceptT,exceptToMaybeT. 
0.3
- #28:
Remove 
putByteStringandputLByteString. - #29:
Remove 
panic,FatalErrorandnotImplemented. RenameNotImplementedintoUndefined. - #32:
Remove 
orAlt,orEmpty,liftAA2,eitherA,purer,<<*>>,traceIO,guardM,hush,tryIO,liftM',liftM2',applyN,guardedA, Bifunctor instances for tuples of length higher than 2. GeneralizeconcatMapM, addconcatForMand operator versions. - #35:
Generalize 
andM,orM,allM,anyMover container type. 
0.2.2
- #33:
Add 
($)andEachtype operators. 
0.2.1
- #24:
Add 
whenNothing,whenNothing_,whenNothingM,whenNothingM_,whenLeft,whenLeftM,whenRight,whenRightM,whenNotNull,whenNotNullM. - #26:
Add 
usingReader,usingReaderT,usingState,usingStateT,executingState,executingStateT,evaluatingState,evaluatingStateT. - Remove 
maybeToEither. 
0.2
- Add 
one(similar tosingleton). - Expose 
SymbolandNattypes fromGHC.TypeLitsby default. - Export 
genericLengthand other generic list return functions. - Rename 
msgtofatalErrorMessage. - Export 
ExceptT - Export 
ReaderT, andStateTconstructors. - Export 
NonEmptytype and constructor for Base 4.9 only. - Export 
Data.Semigrouptype and functions for Base 4.9 only. - Export 
String. 
0.1.13
- Add lenses from 
microlens. - Add 
(<&>). - Reexport 
(&)fromData.Functionif it’s present there instead of always defining our own (this is actually done by reexporting it fromLens.Microwhich does the right thing). - Fix a space leak in 
whenJust. 
0.1.12
- 
Use custom classes instead of
Foldable. Thanks to this,lengthand similar functions can’t anymore be used on tuples orMaybe, but can be used on e.g.Text,ByteStringandIntSet. - 
Add
allM,anyM,andM,orM. - 
Reexport
failandMonadFail. 
0.1.11
- Expose 
putByteStringandputLByteStringmonomorphic versions ofputStrLnfunctions - Switch exported 
(<>)to be fromData.Monoidinstead of Semigroup. - Export 
Hashable 
0.1.10
- Generalize most 
IOfunctions toMonadIO - Make 
dieavailable for older versions of base 
0.1.9
- Make 
sumandproductstrict 
0.1.8
foreachfor applicative traversals.hushfunction for error handling.tryIOfunction for error handling.passfunction for noop applicative branches.- Mask 
Handlertypeclass export. - Mask 
yieldfunction export. 
0.1.7
- Export monadic 
(>>)operator by default. - Add 
traceIdandtraceShowIdfunctions. - Export
readerandstatefunctions by default. - Export lifted 
throwIOandthrowTofunctions. 
0.1.6
- Add uncatchable panic exception throwing using Text message.
 - Remove 
printf - Remove 
string-convdependency so Stack build works withoutextra-deps. - Bring 
Callstackmachinery in for GHC 8.x. - Remove 
throwandassertfromControl.Exceptionexports. - Remove 
unsafeShiftLandunsafeShiftRfromData.Bitsexports. - Reexport 
throwasunsafeThrowvia Unsafe module. - Hides all Show class functions. Only the Class itself is exported. Forbids custom instances that are not GHC derived.
 - Export
encodeUtf8anddecodeUtf8functions by default. - Adds 
unsnocfunction. 
0.1.5
- Initial release.