{-# LANGUAGE NoImplicitPrelude #-}

--------------------------------------------------
--------------------------------------------------

module Prelude.Spiros

 ( -- * Re-exports
   -- $reexports
   module X -- re-eXports

   -- * Usage
   -- $usage   

   -- * Non-exports
   -- $nonexports

   -- * Notes
   -- $notes
 ) where

--------------------------------------------------
-- Exports ---------------------------------------
--------------------------------------------------

import Prelude.Spiros.Types                          as X
import Prelude.Spiros.Reexports                      as X
import Prelude.Spiros.Utilities                      as X
import Prelude.Spiros.System                         as X
import Prelude.Spiros.Exception                      as X
import Prelude.Spiros.Validator                      as X
import Prelude.Spiros.GUI                            as X
import Prelude.Spiros.Generics                       as X
import Prelude.Spiros.Enriched                       as X
import Prelude.Spiros.Parse                          as X
import Prelude.Spiros.Print                          as X

--------------------------------------------------
-- Imports ---------------------------------------
--------------------------------------------------

{- $usage

assertions:

@
'assert' :: Bool -> a -> a 

If the first argument evaluates to True, then the result is the second argument. Otherwise an AssertionFailed exception is raised, containing a String with the source file and line number of the call to assert.

Assertions can normally be turned on or off with a compiler flag (for GHC, assertions are normally on unless optimisation is turned on with -O or the -fignore-asserts option is given). When assertions are turned off, the first argument to assert is ignored, and the second argument is returned as the result.
@

-}

{- $reexports

These are re-exported by @Prelude.Spiros@.

    "Prelude.Spiros.Reexports" re-exports: the core types\/values from several packages; minus /all/ partial functions, /except/ for some functions whose names are prefixed with @"unsafe"@, i.e. "explicitly partial functions", e.g. 'unsafeNatural' (however, no @unsafeHead@ is exported, as its need often implies that the @[]@ being used is the wrong type).

    "Prelude.Spiros.Utilities" defines a few dozen simple utilities, like an extended prelude. 

    "Prelude.Spiros.System" provides system information: about the current operating system, architecture, and compiler. 

    "Prelude.Spiros.Exception" defines a few new exception types, which may (or may not) tag the message with a @TemplateHaskell@ 'Name' or with a 'CallStack', as auxiliary\/contextual information.

    "Prelude.Spiros.Validator" re-exports helpers for defining simple validators (e.g. @a -> Maybe b@). 

    "Prelude.Spiros.GUI" provides helpers for working with @TemplateHaskell@ 'Name's.

    "Prelude.Spiros.TemplateHaskell" provides a few helpers for using @doctest@ and working with @TemplateHaskell@.

-}


{- $nonexports

These must be explicitly imported, they aren't re-exported by @Prelude.Spiros@.

    "Prelude.Spiros.Classes" re-exports only typeclases\/methods (and a few helpers), from several packages (like @Prelude.Spiros.Reexports@), for deriving or defining instances (e.g. in a @.Types@ module). Unlike @Prelude.Spiros.Reexports@, partial functions that are methods (like @toEnum@ and @fromEnum@) are necessarily exported, since they must be /visible/ when manually writing instances. 

-}


{- $notes

Most examples (all those prefixed with a triple `@>>>@`) are @doctest@ed. Those with single `@>@` may have brittle output, and codeblocks might describe relations by "returning" variables, and thus aren't. 

-}