{-# LANGUAGE CPP #-}

module OpenSuse.Prelude
  (
    -- * Standard Prelude
    module Prelude
  , module Control.Monad.Extra
  , module Control.Monad.Fail
  , module Control.Monad.IO.Class
  , module Data.Monoid
  , module Data.Semigroup
  , module Data.Word
  , module GHC.Generics
  , module Numeric.Natural

    -- * Parsing & Pretty Printing
  , Text, LazyText, ByteString, LazyByteString
  , packText, unpackText
  , module OpenSuse.Prelude.Parser
  , module OpenSuse.Prelude.PrettyPrinting
  , module Data.Aeson
  , module Data.String

    -- * Date & Time
  , module Data.Time.Clock

    -- * Container
  , module Data.Set

    -- * Miscellaneous
  , module Control.DeepSeq
  , module Data.Binary
  , module Data.Hashable
  , module Data.Maybe

  )
  where

import Prelude hiding ( fail
#if MIN_VERSION_base(4,11,0)
                      , (<>)  -- https://prime.haskell.org/wiki/Libraries/Proposals/SemigroupMonoid
#endif
                      )

import OpenSuse.Prelude.Parser ( CharParser, HasParser(..), ErrorContext, parseM, parse
                               , runParser, runParserT
                               )
import OpenSuse.Prelude.PrettyPrinting ( Doc, Pretty(pPrint), prettyShow )

import Control.DeepSeq ( NFData )
import Control.Monad.Extra hiding ( fail )
import Control.Monad.Fail
import Control.Monad.IO.Class ( MonadIO(..) )
import Data.Aeson ( FromJSON, ToJSON )
import Data.Binary ( Binary )
import Data.ByteString ( ByteString )
import qualified Data.ByteString.Lazy as LBS
import Data.Hashable ( Hashable )
import Data.Maybe ( fromMaybe )
import Data.Monoid ( Monoid(..) )
import Data.Semigroup ( Semigroup(..) )
import Data.Set ( Set )
import Data.String ( IsString(..) )
import Data.Text ( Text )
import qualified Data.Text as Text
import qualified Data.Text.Lazy as LText
import Data.Time.Clock ( UTCTime(..), DiffTime )
import Data.Word ( Word8 )
import GHC.Generics ( Generic )
import Numeric.Natural ( Natural )

type LazyText = LText.Text
type LazyByteString = LBS.ByteString

packText :: String -> Text
packText :: String -> Text
packText = String -> Text
Text.pack

unpackText :: Text -> String
unpackText :: Text -> String
unpackText = Text -> String
Text.unpack