{-# LANGUAGE CPP         #-}
{-# LANGUAGE Trustworthy #-}

{- |
Copyright:  (c) 2016 Stephen Diehl
            (c) 2016-2018 Serokell
            (c) 2018-2020 Kowainik
SPDX-License-Identifier: MIT
Maintainer:  Kowainik <xrom.xkov@gmail.com>
Stability:   Stable
Portability: Portable

Reexports from @Data.*@ and @GHC.*@ modules of
<https://hackage.haskell.org/package/base base> package.
-}

module Relude.Base
    ( -- * Base types
      module Data.Char

      -- * Base type classes
    , module Data.Eq
    , module Data.Ord

      -- * System IO
    , module System.IO

      -- * Types for type-level computation
    , module Data.Coerce
    , module Data.Kind
    , module Data.Proxy
    , module Data.Typeable
    , module Data.Void

      -- * Basic type classes
    , module GHC.Base
    , module GHC.Enum
    , module GHC.Generics
    , module GHC.Show

-- * GHC-specific functionality
#if MIN_VERSION_base(4,10,0)
    , module GHC.TypeNats
#else
    , module GHC.TypeLits
#endif

    , module GHC.OverloadedLabels
    , module GHC.ExecutionStack
    , module GHC.Stack
    ) where

-- Base types
import Data.Char (Char, chr)

-- IO
import System.IO (FilePath, Handle, IO, IOMode (..), stderr, stdin, stdout, withFile)

-- Base typeclasses
import Data.Eq (Eq (..))
import Data.Ord (Down (..), Ord (..), Ordering (..), comparing)

-- Types for type-level computation
import Data.Coerce (Coercible, coerce)
import Data.Kind (Constraint, Type)
import Data.Proxy (Proxy (..))
import Data.Typeable (Typeable)
import Data.Void (Void, absurd, vacuous)

import GHC.Base (asTypeOf, ord, seq, ($!))
import GHC.Enum (Bounded (..), Enum (..), boundedEnumFrom, boundedEnumFromThen)
import GHC.Generics (Generic)
import GHC.Show (Show)

#if MIN_VERSION_base(4,10,0)
import GHC.TypeNats (CmpNat, KnownNat, Nat, SomeNat (..), natVal, someNatVal)
#else
import GHC.TypeLits (CmpNat, KnownNat, Nat, SomeNat (..), natVal, someNatVal)
#endif

import GHC.ExecutionStack (getStackTrace, showStackTrace)
import GHC.OverloadedLabels (IsLabel (..))
import GHC.Stack (CallStack, HasCallStack, callStack, currentCallStack, getCallStack,
                  prettyCallStack, prettySrcLoc, withFrozenCallStack)