universum

Custom prelude used in Serokell

https://github.com/serokell/universum

LTS Haskell 23.27:1.8.2.2
Stackage Nightly 2025-05-05:1.8.2.2
Latest on Hackage:1.8.2.2

See all snapshotsuniversum appears in

MIT licensedbyStephen Diehl, @serokell
Maintained bySerokell
This version can be pinned in stack with:universum-1.8.2.2@sha256:e174559461633b52fab4ccebcb5489c089de13a30fa0b568ce42837f1342ba55,6793

Module documentation for 1.8.2.2

Universum

GitHub CIHackageStackage LTSStackage NightlyLicense: MIT

universum is a custom prelude used in @Serokell that has:

  1. Excellent documentation: tutorial, migration guide fromPrelude,Haddock with examples for (almost) every function,all examples are tested withdoctest,documentation regarding internal module structure.
  2. universum-specificHLint rules:.hlint.yaml
  3. Focus on safety, convenience and efficiency.

What is this file about?

This README contains introduction toUniversum and a tutorial on how to use it.

Structure of this tutorial

This tutorial has several parts:

  1. Philosophy and motivation.
  2. How to useuniversum.
  3. Changes inPrelude (some gotchas).
  4. Already known things that weren’t inPrelude brought into scope.
  5. New things added.
  6. Migration guide fromPrelude.

This is neither a tutorial onHaskell nor tutorial on each function contained in Universum. For detaileddocumentation of every function together with examples and usage, seeHaddock documentation.

Why another custom Prelude?

Motivation

AtSerokell, we strive to be as productive as possible. That’s why we are usingHaskell. This choice of language impliesthat we’re restricted to usePrelude:implicit import of basic functions, type classes and data types. Unfortunately, the defaultPreludeis considered to be not so gooddue to some historical reasons.

This is why we decided to use a better tool. Luckily,Haskell provides us with the abilityto replace defaultPrelude with an alternative. All we had to do is to implement anew basic set of defaults. There already were plenty ofpreludes,so we didn’t plan to implement everything from scratch.After some long, hot discussions, our team decided to base our custom prelude onprotolude.

The next section explains why we’ve made this choice and what we are willing to do.This tutorial doesn’t cover the differences fromprotolude. Instead, it explains how Universum is different from regularPrelude.

Main goals

While creating and maintaining a custom prelude, we are pursuing the following goals:

  1. Avoid allpartial functions.We liketotal and exception-free functions.You can still use some unsafe functions fromUniversum.Unsafe module,but they are not exported by default.
  2. Use more efficientstring representations.String type is crushingly inefficient. All our functions either try to be polymorphic over stringtype or useTextas the default string type. Because the community is evolving slowly, some libraries still useString type, soString type alias is still reexported. We recommend to avoidString as much as you can!
  3. Try to not reinvent the wheel. We’re not trying to rebuild whole type hierarchy from scratch,as it’s done inclassy-prelude.Instead, we reexport common and well-known things frombase and some otherlibraries that are used in everyday production programming inHaskell.

    Note: well, we did end up inventingsome new things.

  4. Export more useful and commonly used functions.Hello, my name is Dmitry. I wascodingHaskell for 3 years but still hoogling which moduleliftIO comes from.Things likeliftIO,ReaderT type,MVar-related functions have unambiguous names,are used in almost every non-trivial project, and it’s really tedious to import themmanually every time.
  5. Make changes only when there are enough good reasons to make these changes.We have acode modification policy which semi-formally describes pre-conditions for different types of changes.

Unlikeprotolude, we are:

  1. Not trying to be as general as possible (thus we don’t export much fromGHC.Generics).
  2. Not trying to maintain every version ofghc compiler (butat least the latest 3).
  3. Trying to make writing production code easier (seeenhancements and fixes).

How to use Universum

Okay, enough philosophy. If you want to just start usinguniversum andexplore 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 usingEmacs and don’t want totypeimport Universum manually every time, you canmodify your configsa little bit.

If you want to get familiar withuniversum internal structure, you can justread top-level documentation forUniversummodule.

Gotchas

  • head,tail,last,init,foldl1,minimum and other were-partial functions work withNonEmpty a instead of[a].
  • Safe analogue forhead,foldl1,foldr1,minimum,maximum functions, for instance:safeHead :: [a] -> Maybe a.
  • undefined triggers a compiler warning, which is probably not what you want. Either usethrowIO,Except,error orbug.
  • map isfmap now.
  • 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).
  • Functionssum andproduct are strict now, which makes them more efficient.
  • If you try to do something likeputStrLn "hi", you’ll get an error message ifOverloadedStrings is enabled – it happens because the compiler doesn’t know whattype to infer for the string. UseputTextLn in this case.
  • Sinceshow doesn’t come fromShow anymore, you can’t writeShow instances easily.Seemigration guide for details.
  • You can’t call someFoldable methods overMaybe and some other types.Foldable generalization is useful butpotentially error-prone.Instead we created our own fully compatible withFoldableContainer type classbut that restricts the usage of functions likelength overMaybe,Either,Identity and tuples.We’re also usingGHC 8 feature ofcustom compile-time errorsto producemore helpful messages.
  • As a consequence of previous point, some functions liketraverse_,forM_,sequenceA_, etc.are generalized overContainer type classes.
  • error takesText.
  • We are exporting a rewrite rule which replacestoString . toText :: Text -> Text withid. 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 importingUniversum (GHC should tell you which ones).

Then, some commonly used types:Map/HashMap/IntMap,Set/HashSet/IntSet,Seq,Text andByteString(as well as synonymsLText andLByteString for lazy versions).

liftIO andMonadIO are exported by default. A lot ofIO functions are generalized toMonadIO.

deepseq is exported. For instance, if you want to force deep evaluation of some value (in IO),you can writeevaluateNF a. WHNF evaluation is possible withevaluateWHNF a.

We also reexport big chunks of these libraries:mtl,stm,microlens,microlens-mtl.

Bifunctortype class with useful instances is exported.

  • first andsecond functions apply a function to first/second part of a tuple (for tuples).
  • bimap takes two functions and applies them to first and second parts respectively.

Text

We exportText andLText, and some functions work withText instead ofString –specifically, IO functions (readFile,putStrLn, etc) andshow. In fact,showis polymorphic and can produce strict or lazyText,String, orByteString.Also,toText/toLText/toString can convertText|LText|String types toText/LText/String. If you want to convert to and fromByteString useencodeUtf8/decodeUtf8 functions.

Debugging andundefineds

trace,traceM,traceShow, etc. are available by default. GHC will warn youif you accidentally leave them in code, however (same forundefined).

We also havedata Undefined = Undefined (which, too, comes with warnings).

Exceptions

We usesafe-exceptionslibrary for exceptions handling. Don’t importControl.Exceptionsmodule explicitly. Instead use functionality fromsafe-exceptionsprovided byuniversum or importControl.Exceptions.Safe module.

What’s new?

Finally, we can move to part describing the new cool features we bring withuniversum.

  • uncons splits a list at the first element.

  • ordNub andsortNub areO(n log n) versions ofnub (which is quadratic)andhashNub andunstableNub are almostO(n) versions ofnub.

  • (&) – reverse application.x & f & g instead ofg $ f $ x is useful sometimes.

  • whenM,unlessM,ifM,guardM are available and do what you expectthem to do (e.g.whenM (doesFileExist "foo")).

  • Very generalized version ofconcatMapM, too, is available and does what expected.

  • readMaybe andreadEither are likeread but total and give eitherMaybe orEither with 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,orM are monadic version of corresponding functions frombase.

  • Type operator$ for writing types likeMaybe $ Either String $ Maybe Int.

  • Each type family. So this:

    f :: Each [Show, Read] [a, b] => a -> b -> String

    translates into this:

    f :: (Show a, Show b, Read a, Read b) => a -> b -> String
  • With type operator. So this:

    a :: With [Show, Read] a => a -> a

    translates 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]Trueghci> let process = map (+3) ... filterghci> process even [1..5][5,7]
  • Conversions betweenEither andMaybe likerightToMaybe andmaybeToLeftwith clear semantic.

  • using(Reader|State)[T] functions as aliases forflip run(Reader|State)[T].

  • One type classfor creating singleton containers. Even monomorhpic ones likeText.

  • evaluateWHNF andevaluateNF functions as clearer and lifted aliases forevaluate andevaluate . force.

  • ToPairs type class for data types that can be converted to list of pairs (likeMap orHashMap orIntMap).

Migration guide from Prelude

In order to replace defaultPrelude withuniversum you should start with instructions given inhow to use universum section.

This section describes what you need to change to make your code compile withuniversum.

  1. Enable-XOverloadedStrings and-XTypeFamilies extension by default for your project.

  2. Sincehead,tail,minimum and some other functions work forNonEmpty you shouldrefactor your code in one of the multiple ways described below:

    1. Change[a] toNonEmpty a where it makes sense.
    2. Use functions which returnMaybe. They can be implemented usingnonEmpty function. Likehead <$> nonEmpty l.
      • head <$> nonEmpty l issafeHead l
      • tail isdrop 1. It’s almost never a good idea to usetail fromPrelude.
    3. Addimport qualified Universum.Unsafe as Unsafe and replace function with qualified usage.
  3. If you usefromJust or!! you should use them fromimport qualified Universum.Unsafe as Unsafe.

  4. Derive or implementContainer instances for your data types which implementFoldable instances. This can be done in a single line becauseContainertype class automatically derives fromFoldable.

  5. Container type class fromuniversum replacesFoldable and doesn’t haveinstances forMaybe a,(a, b),Identity a andEither a b. If you usefoldr orforM_ or similar for something likeMaybe a you should replaceusages of such function with monomorhpic alternatives:

    • Maybe

      • (?:) :: Maybe a -> a -> a
      • fromMaybe :: a -> Maybe a -> a
      • maybeToList :: Maybe a -> [a]
      • maybeToMonoid :: Monoid m => Maybe m -> m
      • maybe :: b -> (a -> b) -> Maybe a -> b
      • whenJust :: Applicative f => Maybe a -> (a -> f ()) -> f ()
      • whenJustM :: Monad m => m (Maybe a) -> (a -> m ()) -> m ()
    • Either

      • fromLeft :: a -> Either a b -> a
      • fromRight :: b -> Either a b -> b
      • either :: (a -> c) -> (b -> c) -> Either a b -> c
      • whenRight :: Applicative f => Either l r -> (r -> f ()) -> f ()
      • whenRightM :: Monad m => m (Either l r) -> (r -> m ()) -> m ()
  6. If you have types likefoo :: Foldable f => f a -> a -> a you should chose one of the following:

    • Right: Modify types forContainer likefoo :: (Container t, Element t ~ a) => t -> a -> a.
    • Left: ImportData.Foldable modulequalified and use everythingFoldable-related qualified.
  7. Forget aboutString type.

    • ReplaceputStr andputStrLn withputText andputTextLn.
    • Replace(++) with(<>) forString-like types.
    • Try to usefmt library if you need to construct messages.
    • UsetoText/toLText/toString functions to convert toText/LazyText/String types.
    • UseencodeUtf8/decodeUtf8 to convert to/fromByteString.
  8. Runhlint using.hlint.yaml file fromuniversum package to cleanup code and imports.

  9. Since vanillashow from theShow class is not available, your customShow instances will fail to compile.You canimport qualified Text.Show to bring vanillashow to scope with qualified name.It will not conflict withshow fromuniversum and yourShow instances will compile successfully.

Changes

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.
  • #283:Bump the upper version bound ontext to2.0.2.

1.8.1.1

  • #282:Bump the upper version bound ontext to2.0.1.

1.8.1

  • #271:Add compatibility with tasty-hedgehog 1.2.0.0

1.8.0

  • #252:RemoveOption re-export. UseMaybe instead.

  • #176:Deprecatenote.

  • #206:RemovelistToMaybe.Migration guide: usesafeHead directly with functions fromUniversum.Container instead.

  • #182:Deprecatemicrolens andmicrolens-mtl dependencies.

  • #165:Change the type ofreadMaybe fromreadMaybe :: Read a => String -> Maybe ato it’s polymorphic versionreadMaybe :: forall b a. (ToString a, Read b) => a -> Maybe b.

  • #199:Change type ofconcatMap fromconcatMap :: Foldable f => (a -> [b]) -> t a -> [b]toconcatMap :: Container c => (Element c -> [b]) -> c -> [b].

  • 250:Replacegroup export fromData.List withgroup,groupBy,groupWith andgroupAllWith fromData.List.NonEmpty.

1.7.3

  • #236:AddupdateMVar' andupdateTVar'.

  • #244AddToPairs instances for[(k, v)] andNonEmpty (k, v).

  • #238:AddfromList.

1.7.2 (rev1)

  • Permittext-1.2.5.0.

1.7.2

  • Permittext-1.2.4.1.
  • #233:AddsomeNE.

1.7.1

  • #230:AddhoistMaybe andhoistEither functionssimilar torelude

1.7.0

  • #221:Add safe versions ofminimum,maximum,minimumBy,maximumBy,foldr1,foldl1 functions forNonEmpty list.Old their versions fromContainer typeclass now returnMaybe and havesafe prefix in name (e.g.safeMinimum).Add unsafe versions of those functions toUnsafe module.
  • #185:Enable more warnings, fix all warnings.

1.6.1

  • #219:Bump upper bound ontext.

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).

  • #212Added rewrite rule fortoString . toText case.This may change semantics in some corner cases(becausetoString . toText is not strictly the identity function).

  • #215:Fix docstrings inUniversum.Lifted.File to mention correct module whenreferencing related functions.

1.5.0

  • Makeerror’s stacktrace exclude site of theerror function itself.

  • #200:Implemented a lifted version ofwithFile and addedhClose toUniversum.Lifted.File as discussed previously in#186.

  • #204:Maketrace non-polymorphic over text argument, addtraceIdWith andtraceShowIdWith.

  • #197hPutStr,hPutStrLnandhPrint added toUniversum.Print. The interface for the backingtypeclassUniversum.Print.Print changed. It was also moved to the internalmoduleUniversum.Print.Internal and should be considered unstable.

    Migration guide: The interface for thePrint class should be consideredinternal and may be subject to sudden change. If youmust implement yourown instances, then importUniversum.Print.Internal (be aware that there arename clashes in the functions fromUniversum.Print andUniversum.Print.Internal)

  • #201 Generalized the type ofUniversum.Lifted.Env.die. Should not break existing code, apart from,perhaps, type inference.

1.4.0

  • #167:identity has been removed.

    Migration guide: useUniversum.id instead.

  • #177:Themask_ reexport fromsafe-exceptions has been removed.

    Migration guide: useControl.Exception.Safe.mask_ fromsafe-exceptionsinstead.

  • #178:getArgs has been removed.

    Migration guide: useliftIO directly withSystem.Environment.getArgsfrom base.

  • #179:getContents andinteract have been removed.

    Migration guide: useliftIO directly withData.Text.Lazy.IO.getContentsandData.Text.Lazy.IO.interact, both from thetext package.

  • #180:TheLifted.ST module has been removed.

    Migration guide: useliftIO directly with functions fromControl.Monad.ST instead.

  • #181:list has been removed.

1.3.0

  • #167:identity has been deprecated.

    Migration guide: useUniversum.id instead.

  • #170:RemoveElementConstraint from theContainer class.

    Migration guide: removeElementConstraint from every instance and every type signature.

  • #174Thetype-operators dependency has been removed.

  • #177:Themask_ reexport fromsafe-exceptions has been deprecated.

    Migration_guide: useControl.Exception.Safe.mask_ fromsafe-exceptionsinstead.

  • #178:getArgs has been deprecated. To be removed in a future version.

    Migration guide: useliftIO directly withSystem.Environment.getArgsfrombase.

  • #179:getContents andinteract have been deprecated.

    Migration guide: useliftIO directly withData.Text.Lazy.IO.getContentsandData.Text.Lazy.IO.interact, both from thetext package.

  • #180:TheLifted.ST module has been deprecated. To be removed in a futureversion.

    Migration guide: useliftIO directly with functions fromControl.Monad.ST instead.

  • #181:list has been deprecated. To be removed in a future version.

1.2.0

  • #159Breaking change:Removetext-format dependency.

    Migration guide: importBuildable type class either fromtext-format orformatting orfmt library. There is no direct replacement forpretty andprettyL in popular libraries. You can defineprettyL = Data.Text.Lazy.Builder.toLazyText . build andpretty = Data.Text.Lazy.toStrict . prettyL`.

  • #164:Don’t reexportlog :: Floating a => a -> a.

1.1.1

  • #148:AddCODEOWNERS and contributing guide.
  • #135:Add documentation regarding internal module structure.
  • #113:Annotateat function fromUnsafe module andordNubfunction fromNub module withliquidhaskell.
  • #73:Add more examples to docs and fix warnings where possible.
  • Move reexport ofNonEmpty toUniversum.List module.

1.1.0

  • #144:AddExc pattern synonym.
  • #60:ReexportNatural type fromNumeric.Natura module.
  • #118:ReexportType fromData.Kind module.
  • #130:MergeToList andContainer type classes into single type classContainer.
  • #15:Add?: function toUniversum.Monad.Maybe.
  • #128:AddUnsafe module with unsafe functions to works with lists andMaybe.
  • #129:Reexportid.
  • #136:Changefoldl' type back, addflipfoldl' instead.

1.0.4.1

  • #127:Fixdoctest fortext-1.2.3.

1.0.4

  • #53:Adddoctest touniversum. Also imporove and fix documentation.
  • #117:Drop the support ofGHC-8.0.1.
  • #104:ReexporthashWithSalt fromData.Hashable.
  • #95:ReexportCompose fromData.Functor.Compose.
  • #124:Export methods of classException.

1.0.3

  • #114:Reexport more functions fromsafe-exceptions.

1.0.2

  • #91:Change argument order offoldl'.
  • #97:AddToPairs type class with the ability to have list of pairs.

1.0.1

  • #100:Addbug function =impureThrow.

1.0.0

  • #90:Improve project structure.
  • #89:Add export ofUniversum.Nub module toUniversum.
  • AddlistToMaybe toUniversum.Monad.Reexport.
  • #81:MakeputText andputLText to be versions ofputStr.AddputTextLn andputLTextLn – versions ofputStrLn.
  • #5:Add safe versions ofhead,tail,init,last functions forNonEmpty list.Oldhead (which returnsMaybe) is renamed tosafeHead.Reexports fromsafe are removed.
  • Removeunsnoc (this function is very slow and shouldn’t be used).
  • #88:AddHasCallStack => toerror andundefined functions.
  • #58:MakeElement type family be associated type family.Remove{-# OVERLAPPABLE #-} instance forToList andContainer. Add default instances for basic types.RemoveWrappedListnewtype because it’s not needed anymore.RemoveNontrivialContainer constraint alias.
  • #56:Makeelem andnotElem faster forSet andHashSet by introducingElementConstraint associated type family.
  • RemoveUnsafe module. Though, see issue#128for disuccion regarding possible return of this module.

0.9.1

  • Changebase version to be< 5.

0.9.0

  • #79:Import ‘(<>)’ from Semigroup, not Monoid.
  • Improve travis configartion.
  • #80:RenameContainer toToList,NontrivialContainer toContainer.KeepNontrivialContainer as type alias.
  • RenameContainers module toContainer.Class.
  • Move all container-related reexports fromUniversum toContainer.Reexport.
  • Add default implementation ofnull function.
  • AddWrappedList newtype with instance ofContainer.
  • Improve compile time error messages for disallowed instances.

0.8.0

  • #83:Change the order of types inshow andprint functions.
  • Move string related reexports and functions toConv module.
  • RenameConv module toString.
  • Moveprint function toPrint module.
  • #77:Addmodify' function to export list.

0.7.1.1

  • #69:DocumentSuperComposition operator(...).

0.7.1

  • #68:Separate all ‘nub’ functions toNub module, addsortNub andunstableNub there.
  • #54:Reorganize .cabal.
  • #21:Add benchmarks.
  • #65:UseTypeNats instead ofTypeLits when possible.

0.7.0

  • #47:Reexportput andget forMonadState.
  • #48:Export boxedVector type.
  • #49:ExportIdentityT andrunIdentityT.
  • #51:AddfromRight andfromLeft that behave likefromMaybe but forEither.
  • #52:AddmaybeToMonoid :: Monoid m => Maybe m -> m.
  • RemoveSymbol-related types for sure.
  • Return back seems to be useful functionguardM removed inv0.3.
  • AddnotElem forNonTrivialContainer.

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 indecodeUtf8 fromText toByteString.Lazy.

0.5

  • ExportMonadTrans typeclass.
  • RemoveSymbol-related exports fromGHC.TypeLits.
  • RemoveSrcLoc andLocation reexports fromGHC.ExecutionStack.
  • AddWith type operator.
  • AddhashNub.
  • Export strictStateT instead of lazy.

0.4.3

  • Assign associativity and priority to (…), export typeclass itself.

0.4.2

  • #25:Add vararg functions composition operator (…).
  • RewriteconcatMapM &concatForM so that they allow traversedand returned-by-function container types differ.

0.4.1

  • ReexportsortWith fromGHC.Exts.

0.4

  • Addhaddock documentation with 100% coverage.
  • Rewrite README tutorial.
  • #37:Add generalized version ofreadEither.
  • #38:AddevaluateNF,evaluateNF_,evaluateWHNF,evaluateWHNF_.
  • #39:Add lifted versions ofIORef functions.
  • Removeforeach
  • Reexport(&&&) fromControl.Arrow.
  • Add lifted version ofreadTVarIO.
  • interact andgetContents work withLazy Text.
  • ReexportMaybeT,maybeToExceptT,exceptToMaybeT.

0.3

  • #28:RemoveputByteString andputLByteString.
  • #29:Removepanic,FatalError andnotImplemented.RenameNotImplemented intoUndefined.
  • #32:RemoveorAlt,orEmpty,liftAA2,eitherA,purer,<<*>>,traceIO,guardM,hush,tryIO,liftM',liftM2',applyN,guardedA,Bifunctor instances for tuples of length higher than 2.GeneralizeconcatMapM, addconcatForM and operator versions.
  • #35:GeneralizeandM,orM,allM,anyM over container type.

0.2.2

  • #33:Add($) andEach type operators.

0.2.1

  • #24:AddwhenNothing,whenNothing_,whenNothingM,whenNothingM_,whenLeft,whenLeftM,whenRight,whenRightM,whenNotNull,whenNotNullM.
  • #26:AddusingReader,usingReaderT,usingState,usingStateT,executingState,executingStateT,evaluatingState,evaluatingStateT.
  • RemovemaybeToEither.

0.2

  • Addone (similar tosingleton).
  • ExposeSymbol andNat types fromGHC.TypeLits by default.
  • ExportgenericLength and other generic list return functions.
  • Renamemsg tofatalErrorMessage.
  • ExportExceptT
  • ExportReaderT, andStateT constructors.
  • ExportNonEmpty type and constructor for Base 4.9 only.
  • ExportData.Semigroup type and functions for Base 4.9 only.
  • ExportString.

0.1.13

  • Add lenses frommicrolens.
  • Add(<&>).
  • Reexport(&) fromData.Function if it’s present there insteadof always defining our own (this is actually done by reexporting itfromLens.Micro which does the right thing).
  • Fix a space leak inwhenJust.

0.1.12

  • Use custom classes instead ofFoldable. Thanks to this,length and similar functions can’t anymore be used on tuples orMaybe, but can be used on e.g.Text,ByteString andIntSet.

  • AddallM,anyM,andM,orM.

  • Reexportfail andMonadFail.

0.1.11

  • ExposeputByteString andputLByteString monomorphic versions ofputStrLn functions
  • Switch exported(<>) to be fromData.Monoid instead of Semigroup.
  • ExportHashable

0.1.10

  • Generalize mostIO functions toMonadIO
  • Makedie available for older versions of base

0.1.9

  • Makesum andproduct strict

0.1.8

  • foreach for applicative traversals.
  • hush function for error handling.
  • tryIO function for error handling.
  • pass function for noop applicative branches.
  • MaskHandler typeclass export.
  • Maskyield function export.

0.1.7

  • Export monadic(>>) operator by default.
  • AddtraceId andtraceShowId functions.
  • Exportreader andstate functions by default.
  • Export liftedthrowIO andthrowTo functions.

0.1.6

  • Add uncatchable panic exception throwing using Text message.
  • Removeprintf
  • Removestring-conv dependency so Stack build works withoutextra-deps.
  • BringCallstack machinery in for GHC 8.x.
  • Removethrow andassert fromControl.Exception exports.
  • RemoveunsafeShiftL andunsafeShiftR fromData.Bits exports.
  • Reexportthrow asunsafeThrow via Unsafe module.
  • Hides all Show class functions. Only the Class itself is exported. Forbids custom instances that are not GHC derived.
  • Export encodeUtf8 anddecodeUtf8 functions by default.
  • Addsunsnoc function.

0.1.5

  • Initial release.