    {-# LANGUAGE CPP #-}

    module Mueval.Context (
        cleanModules,
        defaultModules,
        defaultPackages,
        qualifiedModules,
    ) where

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

    -- | Return false if any of the listed modules cannot be found in the whitelist.
    cleanModules :: [String] -> Bool
    cleanModules :: [String] -> Bool
    cleanModules = (String -> Bool) -> [String] -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    all (String -> [String] -> Bool
    forall a. Eq a => a -> [a] -> Bool
    forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
    `elem` [String]
    defaultModules)

    {- | Modules which we should load by default. These are of course whitelisted.
       Specifically, we want the Prelude because otherwise things are horribly
       crippled; we want SimpleReflect so we can do neat things (for said neat
       things, see
       <http://twan.home.fmf.nl/blog/haskell/simple-reflection-of-expressions.details>);
       and we want ShowFun to neuter IO stuff even more.
       The rest should be safe to import without clashes, according to the Lambdabot
       sources.
    -}
    defaultModules :: [String]
    defaultModules :: [String]
    defaultModules =
        [ String
    "Prelude"
        , String
    "ShowFun"
        , String
    "Debug.SimpleReflect"
        , String
    "Data.Function"
        , String
    "Control.Applicative"
        , String
    "Control.Arrow"
        , String
    "Control.Monad"
        , String
    "Control.Monad.Cont"
    #if __GLASGOW_HASKELL__ >= 710
        , String
    "Control.Monad.Except"
    #else
        , "Control.Monad.Error"
    #endif
        , String
    "Control.Monad.Fix"
        , String
    "Control.Monad.Identity"
    #if !MIN_VERSION_base(4,7,0)
        , "Control.Monad.Instances"
    #endif
        , String
    "Control.Monad.RWS"
        , String
    "Control.Monad.Reader"
        , String
    "Control.Monad.State"
        , String
    "Control.Monad.State"
        , String
    "Control.Monad.Writer"
        , String
    "Data.Array"
        , String
    "Data.Bits"
        , String
    "Data.Bool"
        , String
    "Data.Char"
        , String
    "Data.Complex"
        , String
    "Data.Dynamic"
        , String
    "Data.Either"
        , String
    "Data.Eq"
        , String
    "Data.Fixed"
        , String
    "Data.Graph"
        , String
    "Data.Int"
        , String
    "Data.Ix"
        , String
    "Data.List"
        , String
    "Data.Maybe"
        , String
    "Data.Monoid"
        , {- -- Commented out because they are not necessarily available. If anyone misses
             -- them, perhaps we could look into forcing a dependency on them in the Cabal
             -- file or perhaps enable them via a CLI flag. For now, we'll stash them in a comment.
                         "Control.Parallel",
                         "Control.Parallel.Strategies",
                         "Data.Number.BigFloat",
                         "Data.Number.CReal",
                         "Data.Number.Dif",
                         "Data.Number.Fixed",
                         "Data.Number.Interval",
                         "Data.Number.Natural",
                         "Data.Number.Symbolic",
                         "Math.OEIS",
          -}
          String
    "Data.Ord"
        , String
    "Data.Ratio"
        , String
    "Data.Tree"
        , String
    "Data.Tuple"
        , String
    "Data.Typeable"
        , String
    "Data.Word"
        , String
    "System.Random"
        , String
    "Test.QuickCheck"
        , String
    "Text.PrettyPrint.HughesPJ"
        , String
    "Text.Printf"
        ]

    defaultPackages :: [String]
    defaultPackages :: [String]
    defaultPackages =
        [ String
    "array"
        , String
    "base"
        , String
    "bytestring"
        , String
    "containers"
        ]

    {- | Borrowed from Lambdabot, this is the whitelist of modules which should be
       safe to import functions from, but which we don't want to import by
       default.
       FIXME: make these qualified imports. The GHC API & Hint currently do not
       support qualified imports.
       WARNING: You can import these with --module, certainly, but the onus is on
       the user to make sure they fully disambiguate function names; ie:

       > mueval  --module Data.Map -e "Prelude.map (+1) [1..100]"
    -}
    qualifiedModules :: [(String, Maybe String)]
    qualifiedModules :: [(String, Maybe String)]
    qualifiedModules =
        [ --                ("Control.Arrow.Transformer", Just "AT"),
          --                ("Control.Arrow.Transformer.All", Just "AT"),
          (String
    "Data.ByteString", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "BS")
        , (String
    "Data.ByteString.Char8", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "BSC")
        , (String
    "Data.ByteString.Lazy", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "BSL")
        , (String
    "Data.ByteString.Lazy.Char8", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "BSLC")
        , (String
    "Data.Foldable", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "Data.Foldable")
        , --               ("Data.Generics", Just "Data.Generics"),
          (String
    "Data.IntMap", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "IM")
        , (String
    "Data.IntSet", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "IS")
        , (String
    "Data.Map", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "M")
        , (String
    "Data.Sequence", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "Data.Sequence")
        , (String
    "Data.Set", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "S")
        , (String
    "Data.Traversable", String -> Maybe String
    forall a. a -> Maybe a
    Just String
    "Data.Traversable")
        ]