{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveDataTypeable #-}
module Distribution.Solver.Types.OptionalStanza
    ( OptionalStanza(..)
    , showStanza
    , enableStanzas
    ) where

import Distribution.Solver.Compat.Prelude
import Prelude ()
import Distribution.Types.ComponentRequestedSpec
            (ComponentRequestedSpec(..), defaultComponentRequestedSpec)

data OptionalStanza
    = TestStanzas
    | BenchStanzas
  deriving (OptionalStanza -> OptionalStanza -> Bool
(OptionalStanza -> OptionalStanza -> Bool)
-> (OptionalStanza -> OptionalStanza -> Bool) -> Eq OptionalStanza
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OptionalStanza -> OptionalStanza -> Bool
$c/= :: OptionalStanza -> OptionalStanza -> Bool
== :: OptionalStanza -> OptionalStanza -> Bool
$c== :: OptionalStanza -> OptionalStanza -> Bool
Eq, Eq OptionalStanza
Eq OptionalStanza
-> (OptionalStanza -> OptionalStanza -> Ordering)
-> (OptionalStanza -> OptionalStanza -> Bool)
-> (OptionalStanza -> OptionalStanza -> Bool)
-> (OptionalStanza -> OptionalStanza -> Bool)
-> (OptionalStanza -> OptionalStanza -> Bool)
-> (OptionalStanza -> OptionalStanza -> OptionalStanza)
-> (OptionalStanza -> OptionalStanza -> OptionalStanza)
-> Ord OptionalStanza
OptionalStanza -> OptionalStanza -> Bool
OptionalStanza -> OptionalStanza -> Ordering
OptionalStanza -> OptionalStanza -> OptionalStanza
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: OptionalStanza -> OptionalStanza -> OptionalStanza
$cmin :: OptionalStanza -> OptionalStanza -> OptionalStanza
max :: OptionalStanza -> OptionalStanza -> OptionalStanza
$cmax :: OptionalStanza -> OptionalStanza -> OptionalStanza
>= :: OptionalStanza -> OptionalStanza -> Bool
$c>= :: OptionalStanza -> OptionalStanza -> Bool
> :: OptionalStanza -> OptionalStanza -> Bool
$c> :: OptionalStanza -> OptionalStanza -> Bool
<= :: OptionalStanza -> OptionalStanza -> Bool
$c<= :: OptionalStanza -> OptionalStanza -> Bool
< :: OptionalStanza -> OptionalStanza -> Bool
$c< :: OptionalStanza -> OptionalStanza -> Bool
compare :: OptionalStanza -> OptionalStanza -> Ordering
$ccompare :: OptionalStanza -> OptionalStanza -> Ordering
$cp1Ord :: Eq OptionalStanza
Ord, Int -> OptionalStanza
OptionalStanza -> Int
OptionalStanza -> [OptionalStanza]
OptionalStanza -> OptionalStanza
OptionalStanza -> OptionalStanza -> [OptionalStanza]
OptionalStanza
-> OptionalStanza -> OptionalStanza -> [OptionalStanza]
(OptionalStanza -> OptionalStanza)
-> (OptionalStanza -> OptionalStanza)
-> (Int -> OptionalStanza)
-> (OptionalStanza -> Int)
-> (OptionalStanza -> [OptionalStanza])
-> (OptionalStanza -> OptionalStanza -> [OptionalStanza])
-> (OptionalStanza -> OptionalStanza -> [OptionalStanza])
-> (OptionalStanza
    -> OptionalStanza -> OptionalStanza -> [OptionalStanza])
-> Enum OptionalStanza
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: OptionalStanza
-> OptionalStanza -> OptionalStanza -> [OptionalStanza]
$cenumFromThenTo :: OptionalStanza
-> OptionalStanza -> OptionalStanza -> [OptionalStanza]
enumFromTo :: OptionalStanza -> OptionalStanza -> [OptionalStanza]
$cenumFromTo :: OptionalStanza -> OptionalStanza -> [OptionalStanza]
enumFromThen :: OptionalStanza -> OptionalStanza -> [OptionalStanza]
$cenumFromThen :: OptionalStanza -> OptionalStanza -> [OptionalStanza]
enumFrom :: OptionalStanza -> [OptionalStanza]
$cenumFrom :: OptionalStanza -> [OptionalStanza]
fromEnum :: OptionalStanza -> Int
$cfromEnum :: OptionalStanza -> Int
toEnum :: Int -> OptionalStanza
$ctoEnum :: Int -> OptionalStanza
pred :: OptionalStanza -> OptionalStanza
$cpred :: OptionalStanza -> OptionalStanza
succ :: OptionalStanza -> OptionalStanza
$csucc :: OptionalStanza -> OptionalStanza
Enum, OptionalStanza
OptionalStanza -> OptionalStanza -> Bounded OptionalStanza
forall a. a -> a -> Bounded a
maxBound :: OptionalStanza
$cmaxBound :: OptionalStanza
minBound :: OptionalStanza
$cminBound :: OptionalStanza
Bounded, Int -> OptionalStanza -> ShowS
[OptionalStanza] -> ShowS
OptionalStanza -> String
(Int -> OptionalStanza -> ShowS)
-> (OptionalStanza -> String)
-> ([OptionalStanza] -> ShowS)
-> Show OptionalStanza
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OptionalStanza] -> ShowS
$cshowList :: [OptionalStanza] -> ShowS
show :: OptionalStanza -> String
$cshow :: OptionalStanza -> String
showsPrec :: Int -> OptionalStanza -> ShowS
$cshowsPrec :: Int -> OptionalStanza -> ShowS
Show, (forall x. OptionalStanza -> Rep OptionalStanza x)
-> (forall x. Rep OptionalStanza x -> OptionalStanza)
-> Generic OptionalStanza
forall x. Rep OptionalStanza x -> OptionalStanza
forall x. OptionalStanza -> Rep OptionalStanza x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep OptionalStanza x -> OptionalStanza
$cfrom :: forall x. OptionalStanza -> Rep OptionalStanza x
Generic, Typeable)

-- | String representation of an OptionalStanza.
showStanza :: OptionalStanza -> String
showStanza :: OptionalStanza -> String
showStanza OptionalStanza
TestStanzas  = String
"test"
showStanza OptionalStanza
BenchStanzas = String
"bench"

-- | Convert a list of 'OptionalStanza' into the corresponding
-- 'ComponentRequestedSpec' which records what components are enabled.
enableStanzas :: [OptionalStanza] -> ComponentRequestedSpec
enableStanzas :: [OptionalStanza] -> ComponentRequestedSpec
enableStanzas = (ComponentRequestedSpec
 -> OptionalStanza -> ComponentRequestedSpec)
-> ComponentRequestedSpec
-> [OptionalStanza]
-> ComponentRequestedSpec
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' ComponentRequestedSpec -> OptionalStanza -> ComponentRequestedSpec
addStanza ComponentRequestedSpec
defaultComponentRequestedSpec
  where
    addStanza :: ComponentRequestedSpec -> OptionalStanza -> ComponentRequestedSpec
addStanza ComponentRequestedSpec
enabled OptionalStanza
TestStanzas  = ComponentRequestedSpec
enabled { testsRequested :: Bool
testsRequested = Bool
True }
    addStanza ComponentRequestedSpec
enabled OptionalStanza
BenchStanzas = ComponentRequestedSpec
enabled { benchmarksRequested :: Bool
benchmarksRequested = Bool
True }

instance Binary OptionalStanza
instance Structured OptionalStanza