{-# LANGUAGE CPP #-}
{-# LANGUAGE Arrows #-}
module Idris.CmdOptions
( opt, getClient, getPkg, getPkgCheck, getPkgClean, getPkgMkDoc,
getPkgREPL, getPkgTest, getPort, getIBCSubDir,
pureArgParser, execArgParserPure, runArgParser
) where
import Idris.Info (getIdrisVersion)
import Idris.Options
import IRTS.CodegenCommon
import qualified Control.Monad.Fail as Fail
import Control.Monad.Trans (lift)
import Control.Monad.Trans.Except (throwE)
import Control.Monad.Trans.Reader (ask)
import Data.Char
import Data.Maybe
import Options.Applicative
import Options.Applicative.Arrows
import Options.Applicative.Types (ReadM(..))
import Text.ParserCombinators.ReadP hiding (many, option)
import Safe (lastMay)
import qualified Text.PrettyPrint.ANSI.Leijen as PP
runArgParser :: IO [Opt]
runArgParser :: IO [Opt]
runArgParser = do [Opt]
opts <- forall a. ParserInfo a -> IO a
execParser forall a b. (a -> b) -> a -> b
$ forall a. Parser a -> InfoMod a -> ParserInfo a
info Parser [Opt]
parser
(forall a. InfoMod a
fullDesc
forall a. Semigroup a => a -> a -> a
<> forall a. Maybe Doc -> InfoMod a
headerDoc (forall a. a -> Maybe a
Just Doc
idrisHeader)
forall a. Semigroup a => a -> a -> a
<> forall a. Maybe Doc -> InfoMod a
progDescDoc (forall a. a -> Maybe a
Just Doc
idrisProgDesc)
forall a. Semigroup a => a -> a -> a
<> forall a. Maybe Doc -> InfoMod a
footerDoc (forall a. a -> Maybe a
Just Doc
idrisFooter)
)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ [Opt] -> [Opt]
preProcOpts [Opt]
opts
where
idrisHeader :: Doc
idrisHeader = [Doc] -> Doc
PP.hsep [String -> Doc
PP.text String
"Idris version", String -> Doc
PP.text String
getIdrisVersion, String -> Doc
PP.text String
", (C) The Idris Community 2016"]
idrisProgDesc :: Doc
idrisProgDesc = [Doc] -> Doc
PP.vsep [Doc
PP.empty,
String -> Doc
PP.text String
"Idris is a general purpose pure functional programming language with dependent",
String -> Doc
PP.text String
"types. Dependent types allow types to be predicated on values, meaning that",
String -> Doc
PP.text String
"some aspects of a program's behaviour can be specified precisely in the type.",
String -> Doc
PP.text String
"It is compiled, with eager evaluation. Its features are influenced by Haskell",
String -> Doc
PP.text String
"and ML.",
Doc
PP.empty,
[Doc] -> Doc
PP.vsep forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (Int -> Doc -> Doc
PP.indent Int
4 forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc
PP.text) [
String
"+ Full dependent types with dependent pattern matching",
String
"+ Simple case expressions, where-clauses, with-rule",
String
"+ Pattern matching let- and lambda-bindings",
String
"+ Overloading via Interfaces (Type class-like), Monad comprehensions",
String
"+ do-notation, idiom brackets",
String
"+ Syntactic conveniences for lists, tuples, dependent pairs",
String
"+ Totality checking",
String
"+ Coinductive types",
String
"+ Indentation significant syntax, Extensible syntax",
String
"+ Tactic based theorem proving (influenced by Coq)",
String
"+ Cumulative universes",
String
"+ Simple Foreign Function Interface",
String
"+ Hugs style interactive environment"
]]
idrisFooter :: Doc
idrisFooter = [Doc] -> Doc
PP.vsep [String -> Doc
PP.text String
"It is important to note that Idris is first and foremost a research tool",
String -> Doc
PP.text String
"and project. Thus the tooling provided and resulting programs created",
String -> Doc
PP.text String
"should not necessarily be seen as production ready nor for industrial use.",
Doc
PP.empty,
String -> Doc
PP.text String
"More details over Idris can be found online here:",
Doc
PP.empty,
Int -> Doc -> Doc
PP.indent Int
4 (String -> Doc
PP.text String
"https://www.idris-lang.org/")]
execArgParserPure :: [String] -> ParserResult [Opt]
execArgParserPure :: [String] -> ParserResult [Opt]
execArgParserPure [String]
args = [Opt] -> [Opt]
preProcOpts forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. ParserPrefs -> ParserInfo a -> [String] -> ParserResult a
execParserPure (PrefsMod -> ParserPrefs
prefs forall m. Monoid m => m
idm) (forall a. Parser a -> InfoMod a -> ParserInfo a
info Parser [Opt]
parser forall m. Monoid m => m
idm) [String]
args
pureArgParser :: [String] -> [Opt]
pureArgParser :: [String] -> [Opt]
pureArgParser [String]
args = case forall a. ParserResult a -> Maybe a
getParseResult ([String] -> ParserResult [Opt]
execArgParserPure [String]
args) of
Just [Opt]
opts -> [Opt] -> [Opt]
preProcOpts [Opt]
opts
Maybe [Opt]
Nothing -> []
parser :: Parser [Opt]
parser :: Parser [Opt]
parser = forall (f :: * -> *) a. Applicative f => A f () a -> f a
runA forall a b. (a -> b) -> a -> b
$ proc () -> do
[Opt]
flags <- forall (f :: * -> *) a. Applicative f => f a -> A f () a
asA Parser [Opt]
parseFlags -< ()
[Opt]
files <- forall (f :: * -> *) a. Applicative f => f a -> A f () a
asA (forall (f :: * -> *) a. Alternative f => f a -> f [a]
many forall a b. (a -> b) -> a -> b
$ forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Opt
Filename forall s. IsString s => ReadM s
str) (forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILES")) -< ()
forall (f :: * -> *) a b. f (a -> b) -> A f a b
A forall a. Parser (a -> a)
parseVersion forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall (f :: * -> *) a b. f (a -> b) -> A f a b
A forall a. Parser (a -> a)
helper -< ([Opt]
flags forall a. [a] -> [a] -> [a]
++ [Opt]
files)
parseFlags :: Parser [Opt]
parseFlags :: Parser [Opt]
parseFlags = forall (f :: * -> *) a. Alternative f => f a -> f [a]
many forall a b. (a -> b) -> a -> b
$
forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
NoBanner (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nobanner" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Suppress the banner")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
Quiet (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'q' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"quiet" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Quiet verbosity")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
Idemode (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"ide-mode" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Run the Idris REPL with machine-readable syntax")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
IdemodeSocket (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"ide-mode-socket" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Choose a socket for IDE mode to listen on")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
Client forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"client")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> Opt
OLogging forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. ReadM a -> Mod OptionFields a -> Parser a
option forall a. Read a => ReadM a
auto (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"log" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"LEVEL" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Debugging log level")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [LogCat] -> Opt
OLogCats forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. ReadM a -> Mod OptionFields a -> Parser a
option (forall s. IsString s => ReadM s
str forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *). MonadFail m => String -> m [LogCat]
parseLogCats)
(forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"logging-categories"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"CATS"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Colon separated logging categories. Use --listlogcats to see list.")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
NoBasePkgs (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nobasepkgs" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Do not use the given base package")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
NoPrelude (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"noprelude" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Do not use the given prelude")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
NoBuiltins (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nobuiltins" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Do not use the builtin functions")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
NoREPL (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"check" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Typecheck only, don't start the REPL")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
Output forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'o' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"output" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Specify output file")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
Interface (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"interface" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Generate interface files from ExportLists")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
TypeInType (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"typeintype" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Turn off Universe checking")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
DefaultTotal (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"total" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Require functions to be total by default")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
DefaultPartial (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"partial")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
WarnPartial (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"warnpartial" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Warn about undeclared partial functions")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
WarnReach (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"warnreach" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Warn about reachable but inaccessible arguments")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
AuditIPkg (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"warnipkg" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Warn about possible incorrect package specifications")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
NoCoverage (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nocoverage")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
ErrContext (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"errorcontext")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
ShowAll (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"info" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Display information about installation.")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
ShowLoggingCats (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"listlogcats" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Display logging categories")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
ShowLibs (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"link" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Display link flags")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
ShowPkgs (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"listlibs" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Display installed libraries")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
ShowLibDir (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"libdir" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Display library directory")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
ShowDocDir (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"docdir" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Display idrisdoc install directory")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
ShowIncs (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"include" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Display the includes flags")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Int -> Opt
Verbose Int
3) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"V2" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Loudest verbosity")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Int -> Opt
Verbose Int
2) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"V1" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Louder verbosity")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Int -> Opt
Verbose Int
1) (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'V' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"V0" forall a. Semigroup a => a -> a -> a
<>forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"verbose" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Loud verbosity")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
IBCSubDir forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"ibcsubdir" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Write IBC files into sub directory")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
ImportDir forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'i' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"idrispath" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Add directory to the list of import paths")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
SourceDir forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"sourcepath" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Add directory to the list of source search paths")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
WarnOnly (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"warn")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
Pkg forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'p' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"package" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Add package as a dependency")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> REPLPort -> Opt
Port forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM REPLPort
portReader (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"port" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PORT" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"REPL TCP port - pass \"none\" to not bind any port")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
PkgBuild forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"build" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"IPKG" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Build package")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
PkgInstall forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"install" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"IPKG" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Install package")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
PkgREPL forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"repl" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"IPKG" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Launch REPL, only for executables")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
PkgClean forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"clean" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"IPKG" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Clean package")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (String -> Opt
PkgDocBuild forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"mkdoc" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"IPKG" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Generate IdrisDoc for package"))
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
PkgDocInstall forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"installdoc" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"IPKG" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Install IdrisDoc for package")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
PkgCheck forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"checkpkg" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"IPKG" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Check package only")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
PkgTest forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"testpkg" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"IPKG" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Run tests for package")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> Opt
IndentWith forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. ReadM a -> Mod OptionFields a -> Parser a
option forall a. Read a => ReadM a
auto (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"indent-with"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"INDENT"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Indentation to use with :makewith (default 2)")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> Opt
IndentClause forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. ReadM a -> Mod OptionFields a -> Parser a
option forall a. Read a => ReadM a
auto (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"indent-clause"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"INDENT"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Indentation to use with :addclause (default 2)")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
BCAsm forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"bytecode")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (OutputType -> Opt
OutputTy OutputType
Raw) (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'S' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"codegenonly" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Do no further compilation of code generator output")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (OutputType -> Opt
OutputTy OutputType
Object) (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'c' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"compileonly" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Compile to object files rather than an executable")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
DumpDefun forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"dumpdefuns")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
DumpCases forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"dumpcases")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Codegen -> Opt
UseCodegen forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Codegen
parseCodegen) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"codegen"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"TARGET"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Select code generator: C, Javascript, Node and bytecode are bundled with Idris")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ((Codegen -> Opt
UseCodegen forall b c a. (b -> c) -> (a -> b) -> a -> c
. IRFormat -> String -> Codegen
Via IRFormat
JSONFormat) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"portable-codegen"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"TARGET"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Pass the name of the code generator. This option is for codegens that take JSON formatted IR."))
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
CodegenArgs forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"cg-opt"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"ARG"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Arguments to pass to code generator")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
EvalExpr forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"eval"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'e'
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"EXPR"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Evaluate an expression without loading the REPL")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (String -> Opt
InterpretScript String
"Main.main") (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"execute" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Execute as idris")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
InterpretScript forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"exec" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"EXPR" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Execute as idris")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ((LanguageExt -> Opt
Extension forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> LanguageExt
getExt) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"extension"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'X'
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"EXT"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Turn on language extension (TypeProviders or ErrorReflection)"))
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Int -> Opt
OptLevel Int
3) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"O3")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Int -> Opt
OptLevel Int
2) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"O2")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Int -> Opt
OptLevel Int
1) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"O1")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Int -> Opt
OptLevel Int
0) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"O0")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Optimisation -> Opt
AddOpt Optimisation
PETransform) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"partial-eval")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Optimisation -> Opt
RemoveOpt Optimisation
PETransform) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"no-partial-eval" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Switch off partial evaluation, mainly for debugging purposes")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Optimisation -> Opt
AddOpt Optimisation
GeneralisedNatHack) (
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"optimise-nat-like-types"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"optimize-nat-like-types"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Enable compilation of Nat-like types to bigints"
)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Optimisation -> Opt
RemoveOpt Optimisation
GeneralisedNatHack) (
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"no-optimise-nat-like-types"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"no-optimize-nat-like-types"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Disable compilation of Nat-like types to bigints"
)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Int -> Opt
OptLevel forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. ReadM a -> Mod OptionFields a -> Parser a
option forall a. Read a => ReadM a
auto (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'O' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"level")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
TargetTriple forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"target" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"TRIPLE" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"If supported the codegen will target the named triple.")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> Opt
TargetCPU forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"cpu" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"CPU" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"If supported the codegen will target the named CPU e.g. corei7 or cortex-m3")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Bool -> Opt
ColourREPL Bool
True) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"colour" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"color" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Force coloured output")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' (Bool -> Opt
ColourREPL Bool
False) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nocolour" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"nocolor" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Disable coloured output")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ConsoleWidth -> Opt
UseConsoleWidth forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. ReadM a -> Mod OptionFields a -> Parser a
option (forall s. IsString s => ReadM s
str forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *). MonadFail m => String -> m ConsoleWidth
parseConsoleWidth) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"consolewidth" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"WIDTH" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Select console width: auto, infinite, nat"))
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
DumpHighlights (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"highlight" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Emit source code highlighting")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
NoOldTacticDeprecationWarnings (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"no-tactic-deprecation-warnings" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Disable deprecation warnings for the old tactic sublanguage")
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' Opt
AllowCapitalizedPatternVariables (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"allow-capitalized-pattern-variables" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Allow pattern variables to be capitalized")
where
getExt :: String -> LanguageExt
getExt :: String -> LanguageExt
getExt String
s = forall a. a -> Maybe a -> a
fromMaybe (forall a. HasCallStack => String -> a
error (String
"Unknown extension " forall a. [a] -> [a] -> [a]
++ String
s)) (String -> Maybe LanguageExt
maybeRead String
s)
maybeRead :: String -> Maybe LanguageExt
maybeRead :: String -> Maybe LanguageExt
maybeRead = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> Maybe a
listToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Read a => ReadS a
reads
portReader :: ReadM REPLPort
portReader :: ReadM REPLPort
portReader =
((PortNumber -> REPLPort
ListenPort forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Read a => ReadM a
auto) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(forall a. ReaderT String (Except ParseError) a -> ReadM a
ReadM forall a b. (a -> b) -> a -> b
$ do String
opt <- forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
if forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
opt forall a. Eq a => a -> a -> Bool
== String
"none"
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ REPLPort
DontListen
else forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) e a. Monad m => e -> ExceptT e m a
throwE forall a b. (a -> b) -> a -> b
$ String -> ParseError
ErrorMsg forall a b. (a -> b) -> a -> b
$
String
"got " forall a. Semigroup a => a -> a -> a
<> String
opt forall a. Semigroup a => a -> a -> a
<> String
" expected port number or \"none\"")
parseVersion :: Parser (a -> a)
parseVersion :: forall a. Parser (a -> a)
parseVersion = forall a. String -> Mod OptionFields (a -> a) -> Parser (a -> a)
infoOption String
getIdrisVersion (forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'v' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"version" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Print version information")
preProcOpts :: [Opt] -> [Opt]
preProcOpts :: [Opt] -> [Opt]
preProcOpts (Opt
NoBuiltins : [Opt]
xs) = Opt
NoBuiltins forall a. a -> [a] -> [a]
: Opt
NoPrelude forall a. a -> [a] -> [a]
: [Opt] -> [Opt]
preProcOpts [Opt]
xs
preProcOpts (Output String
s : [Opt]
xs) = String -> Opt
Output String
s forall a. a -> [a] -> [a]
: Opt
NoREPL forall a. a -> [a] -> [a]
: [Opt] -> [Opt]
preProcOpts [Opt]
xs
preProcOpts (BCAsm String
s : [Opt]
xs) = String -> Opt
BCAsm String
s forall a. a -> [a] -> [a]
: Opt
NoREPL forall a. a -> [a] -> [a]
: [Opt] -> [Opt]
preProcOpts [Opt]
xs
preProcOpts (Opt
x:[Opt]
xs) = Opt
x forall a. a -> [a] -> [a]
: [Opt] -> [Opt]
preProcOpts [Opt]
xs
preProcOpts [] = []
parseCodegen :: String -> Codegen
parseCodegen :: String -> Codegen
parseCodegen String
"bytecode" = Codegen
Bytecode
parseCodegen String
cg = IRFormat -> String -> Codegen
Via IRFormat
IBCFormat (forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
cg)
parseLogCats :: Fail.MonadFail m => String -> m [LogCat]
parseLogCats :: forall (m :: * -> *). MonadFail m => String -> m [LogCat]
parseLogCats String
s =
case forall a. [a] -> Maybe a
lastMay (forall a. ReadP a -> ReadS a
readP_to_S ReadP [LogCat]
doParse String
s) of
Just ([LogCat]
xs, String
_) -> forall (m :: * -> *) a. Monad m => a -> m a
return [LogCat]
xs
Maybe ([LogCat], String)
_ -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Incorrect categories specified"
where
doParse :: ReadP [LogCat]
doParse :: ReadP [LogCat]
doParse = do
[[LogCat]]
cs <- forall a sep. ReadP a -> ReadP sep -> ReadP [a]
sepBy1 ReadP [LogCat]
parseLogCat (Char -> ReadP Char
char Char
':')
ReadP ()
eof
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[LogCat]]
cs)
parseLogCat :: ReadP [LogCat]
parseLogCat :: ReadP [LogCat]
parseLogCat = (String -> ReadP String
string (LogCat -> String
strLogCat LogCat
IParse) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (m :: * -> *) a. Monad m => a -> m a
return [LogCat]
parserCats)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (String -> ReadP String
string (LogCat -> String
strLogCat LogCat
IElab) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (m :: * -> *) a. Monad m => a -> m a
return [LogCat]
elabCats)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (String -> ReadP String
string (LogCat -> String
strLogCat LogCat
ICodeGen) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (m :: * -> *) a. Monad m => a -> m a
return [LogCat]
codegenCats)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (String -> ReadP String
string (LogCat -> String
strLogCat LogCat
ICoverage) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (m :: * -> *) a. Monad m => a -> m a
return [LogCat
ICoverage])
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (String -> ReadP String
string (LogCat -> String
strLogCat LogCat
IIBC) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (m :: * -> *) a. Monad m => a -> m a
return [LogCat
IIBC])
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (String -> ReadP String
string (LogCat -> String
strLogCat LogCat
IErasure) forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (m :: * -> *) a. Monad m => a -> m a
return [LogCat
IErasure])
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ReadP [LogCat]
parseLogCatBad
parseLogCatBad :: ReadP [LogCat]
parseLogCatBad :: ReadP [LogCat]
parseLogCatBad = do
String
s <- ReadP String
look
forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"Category: " forall a. [a] -> [a] -> [a]
++ String
s forall a. [a] -> [a] -> [a]
++ String
" is not recognised."
parseConsoleWidth :: Fail.MonadFail m => String -> m ConsoleWidth
parseConsoleWidth :: forall (m :: * -> *). MonadFail m => String -> m ConsoleWidth
parseConsoleWidth String
"auto" = forall (m :: * -> *) a. Monad m => a -> m a
return ConsoleWidth
AutomaticWidth
parseConsoleWidth String
"infinite" = forall (m :: * -> *) a. Monad m => a -> m a
return ConsoleWidth
InfinitelyWide
parseConsoleWidth String
s =
case forall a. [a] -> Maybe a
lastMay (forall a. ReadP a -> ReadS a
readP_to_S ReadP Int
integerReader String
s) of
Just (Int
r, String
_) -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> ConsoleWidth
ColsWide Int
r
Maybe (Int, String)
_ -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"Cannot parse: " forall a. [a] -> [a] -> [a]
++ String
s
integerReader :: ReadP Int
integerReader :: ReadP Int
integerReader = do
String
digits <- forall a. ReadP a -> ReadP [a]
many1 forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> ReadP Char
satisfy Char -> Bool
isDigit
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. Read a => String -> a
read String
digits