{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ExplicitNamespaces #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
module Protolude (
module X,
module Base,
identity,
map,
uncons,
unsnoc,
applyN,
print,
throwIO,
throwTo,
show,
pass,
guarded,
guardedA,
LText,
LByteString,
liftIO1,
liftIO2,
#if !MIN_VERSION_base(4,8,0)
(&),
scanl',
#endif
die,
) where
import Debug as X
import Protolude.List as X
import Protolude.Show as X
import Protolude.Bool as X
import Protolude.Monad as X
import Protolude.Functor as X
import Protolude.Either as X
import Protolude.Applicative as X
import Protolude.Conv as X
import Protolude.Panic as X
import Protolude.Exceptions as X
import Protolude.Semiring as X
import Protolude.Base as Base hiding (
putStr
, putStrLn
, print
, show
, showFloat
, showList
, showSigned
, showSignedFloat
, showsPrec
)
import qualified Protolude.Base as PBase
import Data.String (String)
import Data.String as X (IsString)
import Protolude.Safe as X (
headMay
, headDef
, initMay
, initDef
, initSafe
, tailMay
, tailDef
, tailSafe
, lastDef
, lastMay
, foldr1May
, foldl1May
, foldl1May'
, maximumMay
, minimumMay
, maximumDef
, minimumDef
, atMay
, atDef
)
import Control.Applicative as X (
Applicative(..)
, Alternative(..)
, Const(..)
, ZipList(..)
, (<**>)
, liftA
, liftA2
, liftA3
, optional
)
import Data.Eq as X (
Eq(..)
)
import Data.Ord as X (
Ord(..)
, Ordering(..)
, Down(..)
, comparing
)
import Data.Traversable as X
import Data.Foldable as X hiding (
foldr1
, foldl1
, product
, sum
)
import Data.Functor.Identity as X (
Identity(..)
)
#if MIN_VERSION_base(4,9,0)
import Data.List.NonEmpty as X (
NonEmpty(..)
, nonEmpty
)
import Data.Semigroup as X (
Semigroup(sconcat, stimes)
, WrappedMonoid
, Option(..)
, option
, diff
, cycle1
, stimesMonoid
, stimesIdempotent
, stimesIdempotentMonoid
, mtimesDefault
)
#endif
import Data.Monoid as X
#if !MIN_VERSION_base(4,8,0)
import Protolude.Bifunctor as X (Bifunctor(..))
#else
import Data.Bifunctor as X (Bifunctor(..))
#endif
import Control.DeepSeq as X (
NFData(..)
, ($!!)
, deepseq
, force
)
import Data.Tuple as X (
fst
, snd
, curry
, uncurry
, swap
)
import Data.List as X (
splitAt
, break
, intercalate
, isPrefixOf
, drop
, filter
, reverse
, replicate
, take
, sortBy
, sort
, intersperse
, transpose
, subsequences
, permutations
, scanl
#if MIN_VERSION_base(4,8,0)
, scanl'
#endif
, scanr
, iterate
, repeat
, cycle
, unfoldr
, takeWhile
, dropWhile
, group
, inits
, tails
, zipWith
, zip
, unzip
, genericLength
, genericTake
, genericDrop
, genericSplitAt
, genericReplicate
)
#if !MIN_VERSION_base(4,8,0)
import GHC.Exts (build)
import Data.List (tail)
#endif
import Data.Hashable as X (
Hashable
, hash
, hashWithSalt
, hashUsing
)
import Data.Map as X (Map)
import Data.Set as X (Set)
import Data.Sequence as X (Seq)
import Data.IntMap as X (IntMap)
import Data.IntSet as X (IntSet)
#if MIN_VERSION_base(4,7,0)
import Data.Proxy as X (
Proxy(..)
)
import Data.Typeable as X (
TypeRep
, Typeable
, typeRep
, cast
, eqT
)
import Data.Type.Coercion as X (
Coercion(..)
, coerceWith
, repr
)
import Data.Type.Equality as X (
(:~:)(..)
, type (==)
, sym
, trans
, castWith
, gcastWith
)
#endif
#if MIN_VERSION_base(4,8,0)
import Data.Void as X (
Void
, absurd
, vacuous
)
#endif
import Control.Monad.State as X (
MonadState
, State
, StateT(StateT)
, put
, get
, gets
, modify
, state
, withState
, runState
, execState
, evalState
, runStateT
, execStateT
, evalStateT
)
import Control.Monad.Reader as X (
MonadReader
, Reader
, ReaderT(ReaderT)
, ask
, asks
, local
, reader
, runReader
, runReaderT
)
import Control.Monad.Trans.Except as X (
throwE
, catchE
)
import Control.Monad.Except as X (
MonadError
, Except
, ExceptT(ExceptT)
, throwError
, catchError
, runExcept
, runExceptT
, mapExcept
, mapExceptT
, withExcept
, withExceptT
)
import Control.Monad.Trans as X (
MonadIO
, lift
, liftIO
)
import Data.Int as X (
Int
, Int8
, Int16
, Int32
, Int64
)
import Data.Bits as X hiding (
unsafeShiftL
, unsafeShiftR
)
import Data.Word as X (
Word
, Word8
, Word16
, Word32
, Word64
#if MIN_VERSION_base(4,7,0)
, byteSwap16
, byteSwap32
, byteSwap64
#endif
)
import Data.Either as X (
Either(..)
, either
, lefts
, rights
, partitionEithers
#if MIN_VERSION_base(4,7,0)
, isLeft
, isRight
#endif
)
import Data.Complex as X (
Complex(..)
, realPart
, imagPart
, mkPolar
, cis
, polar
, magnitude
, phase
, conjugate
)
import Data.Char as X (chr)
import Data.Bool as X hiding (bool)
import Data.Maybe as X hiding (fromJust)
import Data.Function as X (
const
, (.)
, ($)
, flip
, fix
, on
#if MIN_VERSION_base(4,8,0)
, (&)
#endif
)
import GHC.Generics as X (
Generic(..)
, Generic1
, Rep
, K1(..)
, M1(..)
, U1(..)
, V1
, D1
, C1
, S1
, (:+:)(..)
, (:*:)(..)
, (:.:)(..)
, Rec0
, Constructor(..)
, Datatype(..)
, Selector(..)
, Fixity(..)
, Associativity(..)
#if ( __GLASGOW_HASKELL__ >= 800 )
, Meta(..)
, FixityI(..)
, URec
#endif
)
import qualified Data.ByteString.Lazy
import Data.ByteString as X (ByteString)
import Data.Text as X (Text)
import qualified Data.Text.Lazy
import Data.Text.IO as X (
getLine
, getContents
, interact
, readFile
, writeFile
, appendFile
)
import Data.Text.Lazy as X (
toStrict
, fromStrict
)
import Data.Text.Encoding as X (
encodeUtf8
, decodeUtf8
, decodeUtf8'
, decodeUtf8With
)
import Data.Text.Encoding.Error as X (
OnDecodeError
, OnError
, UnicodeException
, lenientDecode
, strictDecode
, ignore
, replace
)
import System.Environment as X (getArgs)
import qualified System.Exit
import System.Exit as X (
ExitCode(..)
, exitWith
, exitFailure
, exitSuccess
)
import System.IO as X (
Handle
, FilePath
, IOMode(..)
, stdin
, stdout
, stderr
, withFile
, openFile
)
import Control.Monad.ST as X (
ST
, runST
, fixST
)
import Control.Exception as X hiding (
throw
, throwIO
, throwTo
, assert
, Handler(..)
)
import qualified Control.Exception
import Control.Monad.STM as X (
STM
, atomically
#if !(MIN_VERSION_stm(2,5,0))
, always
, alwaysSucceeds
#endif
, retry
, orElse
, check
, throwSTM
, catchSTM
)
import Control.Concurrent as X hiding (
throwTo
, yield
)
import Control.Concurrent.Async as X (
Async(..)
, Concurrently(..)
, async
, asyncBound
, asyncOn
, withAsync
, withAsyncBound
, withAsyncOn
, wait
, poll
, waitCatch
, cancel
, cancelWith
, asyncThreadId
, waitAny
, waitAnyCatch
, waitAnyCancel
, waitAnyCatchCancel
, waitEither
, waitEitherCatch
, waitEitherCancel
, waitEitherCatchCancel
, waitEither_
, waitBoth
, link
, link2
, race
, race_
, concurrently
)
import Foreign.Ptr as X (IntPtr, WordPtr)
import Foreign.Storable as X (Storable)
import Foreign.StablePtr as X (StablePtr)
import Text.Read as X (
Read
, reads
, readMaybe
, readEither
)
type LText = Data.Text.Lazy.Text
type LByteString = Data.ByteString.Lazy.ByteString
#if !MIN_VERSION_base(4,8,0)
infixl 1 &
(&) :: a -> (a -> b) -> b
x & f = f x
#endif
identity :: a -> a
identity x = x
map :: Functor f => (a -> b) -> f a -> f b
map = fmap
uncons :: [a] -> Maybe (a, [a])
uncons [] = Nothing
uncons (x:xs) = Just (x, xs)
unsnoc :: [x] -> Maybe ([x],x)
unsnoc = foldr go Nothing
where
go x mxs = Just (case mxs of
Nothing -> ([], x)
Just (xs, e) -> (x:xs, e))
applyN :: Int -> (a -> a) -> a -> a
applyN n f = X.foldr (.) identity (X.replicate n f)
print :: (X.MonadIO m, PBase.Show a) => a -> m ()
print = liftIO . PBase.print
throwIO :: (X.MonadIO m, Exception e) => e -> m a
throwIO = liftIO . Control.Exception.throwIO
throwTo :: (X.MonadIO m, Exception e) => ThreadId -> e -> m ()
throwTo tid e = liftIO (Control.Exception.throwTo tid e)
pass :: Applicative f => f ()
pass = pure ()
guarded :: (Alternative f) => (a -> Bool) -> a -> f a
guarded p x = X.bool empty (pure x) (p x)
guardedA :: (Functor f, Alternative t) => (a -> f Bool) -> a -> f (t a)
guardedA p x = X.bool empty (pure x) <$> p x
liftIO1 :: MonadIO m => (a -> IO b) -> a -> m b
liftIO1 = (.) liftIO
liftIO2 :: MonadIO m => (a -> b -> IO c) -> a -> b -> m c
liftIO2 = ((.).(.)) liftIO
show :: (Show a, StringConv String b) => a -> b
show x = toS (PBase.show x)
{-# SPECIALIZE show :: Show a => a -> Text #-}
{-# SPECIALIZE show :: Show a => a -> LText #-}
{-# SPECIALIZE show :: Show a => a -> ByteString #-}
{-# SPECIALIZE show :: Show a => a -> LByteString #-}
{-# SPECIALIZE show :: Show a => a -> String #-}
#if MIN_VERSION_base(4,8,0)
die :: Text -> IO a
die err = System.Exit.die (toS err)
#else
die :: Text -> IO a
die err = hPutStrLn stderr err >> exitFailure
#endif
#if !MIN_VERSION_base(4,8,0)
{-# NOINLINE [1] scanl' #-}
scanl' :: (b -> a -> b) -> b -> [a] -> [b]
scanl' = scanlGo'
where
scanlGo' :: (b -> a -> b) -> b -> [a] -> [b]
scanlGo' f !q ls = q : (case ls of
[] -> []
x:xs -> scanlGo' f (f q x) xs)
{-# RULES
"scanl'" [~1] forall f a bs . scanl' f a bs =
build (\c n -> a `c` foldr (scanlFB' f c) (flipSeqScanl' n) bs a)
"scanlList'" [1] forall f a bs .
foldr (scanlFB' f (:)) (flipSeqScanl' []) bs a = tail (scanl' f a bs)
#-}
{-# INLINE [0] scanlFB' #-}
scanlFB' :: (b -> a -> b) -> (b -> c -> c) -> a -> (b -> c) -> b -> c
scanlFB' f c = \b g -> \x -> let !b' = f x b in b' `c` g b'
{-# INLINE [0] flipSeqScanl' #-}
flipSeqScanl' :: a -> b -> a
flipSeqScanl' a !_b = a
#endif