{-# LANGUAGE NoImplicitPrelude #-}

{-|
Module: Precursor
Description: A fun-ish Prelude replacement
License: MIT
Maintainer: mail@doisinkidney.com
Stability: experimental

Features

[No more 'String']
'String' is removed in favor of lazy 'Data.Text.Lazy.Text'.

[No more 'Num']
The 'Num' typeclass is now just for types which can be converted from
integer literals.

['Semigroup's]
'Semigroup's are now in scope by default, as well as some useful
wrappers.

['Semiring's]
A 'Semiring' has the operations '+' and '*', and the members 'one'
and 'zero'. 'Bool' is a 'Semiring', as is 'Integer', etc. 'Num' is
/not/ a superclass of 'Semiring'.

[Sensibly strict]
Several functions, such as 'foldl', 'sum', 'product', etc. are strict
as default.

[No unnecessary 'Monad's]
Functions such as 'Control.Monad.sequence', 'Control.Monad.>>', and
'Control.Monad.replicateM' are removed in favor of the equivalent
'sequenceA', '*>', and 'replicateA' on 'Applicative's.

[Fewer partial functions]
Functions like 'head', 'last', 'minimum', etc. now return 'Nothing'
when called on empty structures. 'tail' and 'init' return empty
lists when called on empty lists.

[Data structures]
'Map' and 'Set' (the strict variants) are now in scope by default,
with a minimal, non-colliding aliased api.

[Transformers]
'State' is now in scope by default.

[Debugging]
Handy functions like 'trace', 'traceShow', and 'notImplemented' are
in scope by default. They give warnings when used so they can't be
forgotten.

[Other handy functions]
An /O(n*log n)/ 'nub', 'foldr2', 'converge', 'bool', and others.
-}

module Precursor
  ( module Precursor.Algebra.Enum
  , module Precursor.Algebra.Eq
  , module Precursor.Algebra.Monoid
  , module Precursor.Algebra.Ord
  , module Precursor.Algebra.Ring
  , module Precursor.Algebra.Semigroup
  , module Precursor.Algebra.Semiring
  , module Precursor.Coerce
  , module Precursor.Control.Alternative
  , module Precursor.Control.Applicative
  , module Precursor.Control.Bifunctor
  , module Precursor.Control.Category
  , module Precursor.Control.Functor
  , module Precursor.Control.Monad
  , module Precursor.Control.State
  , module Precursor.Data.Bool
  , module Precursor.Data.Either
  , module Precursor.Data.List
  , module Precursor.Data.Map
  , module Precursor.Data.Maybe
  , module Precursor.Data.Set
  , module Precursor.Data.Tuple
  , module Precursor.Debug
  , module Precursor.Function
  , module Precursor.Numeric.Integral
  , module Precursor.Numeric.Num
  , module Precursor.Structure.Foldable
  , module Precursor.Structure.Traversable
  , module Precursor.System.IO
  , module Precursor.Text.Show
  , module Precursor.Text.Text
  ) where

import           Precursor.Algebra.Enum
import           Precursor.Algebra.Eq
import           Precursor.Algebra.Monoid
import           Precursor.Algebra.Ord
import           Precursor.Algebra.Ring
import           Precursor.Algebra.Semigroup
import           Precursor.Algebra.Semiring
import           Precursor.Coerce
import           Precursor.Control.Alternative
import           Precursor.Control.Applicative
import           Precursor.Control.Bifunctor
import           Precursor.Control.Category
import           Precursor.Control.Functor
import           Precursor.Control.Monad
import           Precursor.Control.State
import           Precursor.Data.Bool
import           Precursor.Data.Either
import           Precursor.Data.List
import           Precursor.Data.Map
import           Precursor.Data.Maybe
import           Precursor.Data.Set
import           Precursor.Data.Tuple
import           Precursor.Debug
import           Precursor.Function
import           Precursor.Numeric.Integral
import           Precursor.Numeric.Num
import           Precursor.Structure.Foldable
import           Precursor.Structure.Traversable
import           Precursor.System.IO
import           Precursor.Text.Show
import           Precursor.Text.Text