module Scientist.NamedCandidate
  ( NamedCandidate
  , namedCandidate
  , namedCandidateName
  , runNamedCandidate
  ) where

import Prelude

import Control.Monad.IO.Unlift (MonadUnliftIO)
import Data.Text (Text)
import Scientist.Candidate
import UnliftIO.Exception (SomeException, tryAny)

data NamedCandidate m a = NamedCandidate Text (m (Candidate a))

namedCandidate :: Text -> m (Candidate a) -> NamedCandidate m a
namedCandidate :: Text -> m (Candidate a) -> NamedCandidate m a
namedCandidate = Text -> m (Candidate a) -> NamedCandidate m a
forall (m :: * -> *) a.
Text -> m (Candidate a) -> NamedCandidate m a
NamedCandidate

namedCandidateName :: NamedCandidate m a -> Text
namedCandidateName :: NamedCandidate m a -> Text
namedCandidateName (NamedCandidate Text
x m (Candidate a)
_) = Text
x

runNamedCandidate
  :: MonadUnliftIO m => NamedCandidate m a -> m (Either SomeException a)
runNamedCandidate :: NamedCandidate m a -> m (Either SomeException a)
runNamedCandidate (NamedCandidate Text
_ m (Candidate a)
f) = m a -> m (Either SomeException a)
forall (m :: * -> *) a.
MonadUnliftIO m =>
m a -> m (Either SomeException a)
tryAny (m a -> m (Either SomeException a))
-> m a -> m (Either SomeException a)
forall a b. (a -> b) -> a -> b
$ Candidate a -> a
forall a. Candidate a -> a
unCandidate (Candidate a -> a) -> m (Candidate a) -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (Candidate a)
f