module Package.C.Triple.Parse ( parseTriple
                              , parseTripleIO
                              ) where

import           CPkgPrelude
import           Package.C.Error
import           Package.C.Triple.Type
import           Text.Megaparsec
import           Text.Megaparsec.Char

type Parser = Parsec Void String

parseTripleIO :: MonadIO m => String -> m TargetTriple
parseTripleIO :: forall (m :: * -> *). MonadIO m => [Char] -> m TargetTriple
parseTripleIO = Parser TargetTriple -> [Char] -> m TargetTriple
forall (m :: * -> *) a. MonadIO m => Parser a -> [Char] -> m a
parseIO Parser TargetTriple
parseTriple

parseIO :: MonadIO m => Parser a -> String -> m a
parseIO :: forall (m :: * -> *) a. MonadIO m => Parser a -> [Char] -> m a
parseIO Parser a
p [Char]
str =
    case Parser a
-> [Char] -> [Char] -> Either (ParseErrorBundle [Char] Void) a
forall e s a.
Parsec e s a -> [Char] -> s -> Either (ParseErrorBundle s e) a
parse Parser a
p [Char]
"(none)" [Char]
str of
        Right a
x  -> a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
        Left ParseErrorBundle [Char] Void
err -> [Char] -> m a
forall (m :: * -> *) a. MonadIO m => [Char] -> m a
parseErr (ParseErrorBundle [Char] Void -> [Char]
forall s e.
(VisualStream s, TraversableStream s, ShowErrorComponent e) =>
ParseErrorBundle s e -> [Char]
errorBundlePretty ParseErrorBundle [Char] Void
err)

parseTriple :: Parser TargetTriple
parseTriple :: Parser TargetTriple
parseTriple = Arch -> Maybe Manufacturer -> OS -> Maybe ABI -> TargetTriple
TargetTriple
    (Arch -> Maybe Manufacturer -> OS -> Maybe ABI -> TargetTriple)
-> ParsecT Void [Char] Identity Arch
-> ParsecT
     Void
     [Char]
     Identity
     (Maybe Manufacturer -> OS -> Maybe ABI -> TargetTriple)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void [Char] Identity Arch
parseArch
    ParsecT
  Void
  [Char]
  Identity
  (Maybe Manufacturer -> OS -> Maybe ABI -> TargetTriple)
-> ParsecT Void [Char] Identity (Maybe Manufacturer)
-> ParsecT Void [Char] Identity (OS -> Maybe ABI -> TargetTriple)
forall a b.
ParsecT Void [Char] Identity (a -> b)
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT Void [Char] Identity Manufacturer
-> ParsecT Void [Char] Identity (Maybe Manufacturer)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (ParsecT Void [Char] Identity Manufacturer
-> ParsecT Void [Char] Identity Manufacturer
forall a.
ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Token [Char] -> ParsecT Void [Char] Identity (Token [Char])
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token [Char]
'-' ParsecT Void [Char] Identity Char
-> ParsecT Void [Char] Identity Manufacturer
-> ParsecT Void [Char] Identity Manufacturer
forall a b.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity b -> ParsecT Void [Char] Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Void [Char] Identity Manufacturer
parseManufacturer))
    ParsecT Void [Char] Identity (OS -> Maybe ABI -> TargetTriple)
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity (Maybe ABI -> TargetTriple)
forall a b.
ParsecT Void [Char] Identity (a -> b)
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Token [Char] -> ParsecT Void [Char] Identity (Token [Char])
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token [Char]
'-' ParsecT Void [Char] Identity Char
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a b.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity b -> ParsecT Void [Char] Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Void [Char] Identity OS
parseOS)
    ParsecT Void [Char] Identity (Maybe ABI -> TargetTriple)
-> ParsecT Void [Char] Identity (Maybe ABI) -> Parser TargetTriple
forall a b.
ParsecT Void [Char] Identity (a -> b)
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity (Maybe ABI)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Token [Char] -> ParsecT Void [Char] Identity (Token [Char])
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token [Char]
'-' ParsecT Void [Char] Identity Char
-> ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
forall a b.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity b -> ParsecT Void [Char] Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Void [Char] Identity ABI
parseABI)

tryString :: String -> Parser String
tryString :: [Char] -> Parser [Char]
tryString = Parser [Char] -> Parser [Char]
forall a.
ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser [Char] -> Parser [Char])
-> ([Char] -> Parser [Char]) -> [Char] -> Parser [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Parser [Char]
Tokens [Char] -> ParsecT Void [Char] Identity (Tokens [Char])
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string

parseArch :: Parser Arch
parseArch :: ParsecT Void [Char] Identity Arch
parseArch =
        ([Char] -> Parser [Char]
tryString [Char]
"x86_64" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
X64)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"armv7l" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
Arm)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"arm" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
Arm)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"aarch64" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
AArch)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"riscv64" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
RISCV64)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"powerpc64le" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
PowerPC64le)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"powerpc64" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
PowerPC64)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"powerpc" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
PowerPC)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"sparc64" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
Sparc64)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"s390x" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
S390x)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"alpha" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
Alpha)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"m68k" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
M68k)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"mipsisa32r6el" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
MipsIsa32r6El)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"mipsisa32r6" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
MipsIsa32r6)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"mipsisa64r6el" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
MipsIsa64r6El)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"mipsisa64r6" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
MipsIsa64r6)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"mips64el" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
Mips64El)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"mips64" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
Mips64)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"mipsel" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
MipsEl)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"mips" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
Mips)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"i686" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
X86)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"sh4" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
SH4)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"hppa64" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
HPPA64)
    ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
-> ParsecT Void [Char] Identity Arch
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"hppa" Parser [Char] -> Arch -> ParsecT Void [Char] Identity Arch
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Arch
HPPA)

parseManufacturer :: Parser Manufacturer
parseManufacturer :: ParsecT Void [Char] Identity Manufacturer
parseManufacturer =
        ([Char] -> Parser [Char]
tryString [Char]
"unknown" Parser [Char]
-> Manufacturer -> ParsecT Void [Char] Identity Manufacturer
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Manufacturer
Unknown)
    ParsecT Void [Char] Identity Manufacturer
-> ParsecT Void [Char] Identity Manufacturer
-> ParsecT Void [Char] Identity Manufacturer
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"apple" Parser [Char]
-> Manufacturer -> ParsecT Void [Char] Identity Manufacturer
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Manufacturer
Apple)
    ParsecT Void [Char] Identity Manufacturer
-> ParsecT Void [Char] Identity Manufacturer
-> ParsecT Void [Char] Identity Manufacturer
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"ibm" Parser [Char]
-> Manufacturer -> ParsecT Void [Char] Identity Manufacturer
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Manufacturer
IBM)
    ParsecT Void [Char] Identity Manufacturer
-> ParsecT Void [Char] Identity Manufacturer
-> ParsecT Void [Char] Identity Manufacturer
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"pc" Parser [Char]
-> Manufacturer -> ParsecT Void [Char] Identity Manufacturer
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Manufacturer
PC)

parseOS :: Parser OS
parseOS :: ParsecT Void [Char] Identity OS
parseOS =
        ([Char] -> Parser [Char]
tryString [Char]
"darwin" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
Darwin)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"dragonfly" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
Dragonfly)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"freebsd" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
FreeBSD)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"linux" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
Linux)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"openbsd" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
OpenBSD)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"netbsd" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
NetBSD)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"solaris" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
Solaris)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"w64" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
Windows)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"redox" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
Redox)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"haiku" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
Haiku)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"ios" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
IOS)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"aix" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
AIX)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"hurd" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
Hurd)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"android" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
Android)
    ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
-> ParsecT Void [Char] Identity OS
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"none" Parser [Char] -> OS -> ParsecT Void [Char] Identity OS
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> OS
NoOs)

parseABI :: Parser ABI
parseABI :: ParsecT Void [Char] Identity ABI
parseABI =
        ([Char] -> Parser [Char]
tryString [Char]
"gnueabihf" Parser [Char] -> ABI -> ParsecT Void [Char] Identity ABI
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ABI
GNUeabihf)
    ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"gnuabi64" Parser [Char] -> ABI -> ParsecT Void [Char] Identity ABI
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ABI
GNUabi64)
    ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"gnueabi" Parser [Char] -> ABI -> ParsecT Void [Char] Identity ABI
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ABI
GNUeabi)
    ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"gnuspe" Parser [Char] -> ABI -> ParsecT Void [Char] Identity ABI
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ABI
GNUspe)
    ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"gnu" Parser [Char] -> ABI -> ParsecT Void [Char] Identity ABI
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ABI
GNU)
    ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
-> ParsecT Void [Char] Identity ABI
forall a.
ParsecT Void [Char] Identity a
-> ParsecT Void [Char] Identity a -> ParsecT Void [Char] Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ([Char] -> Parser [Char]
tryString [Char]
"mingw32" Parser [Char] -> ABI -> ParsecT Void [Char] Identity ABI
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ABI
MinGw)