module HaskellWorks.CabalCache.Options
  ( readOrFromTextOption,
  ) where

import Amazonka.Data.Text    (FromText (..), fromText)
import HaskellWorks.Prelude
import Options.Applicative   (Parser, Mod, OptionFields)

import qualified Data.Text            as T
import qualified Options.Applicative  as OA

orElse :: Either e a -> Either e a -> Either e a
orElse :: forall e a. Either e a -> Either e a -> Either e a
orElse Either e a
a Either e a
b =
  (e -> Either e a) -> (a -> Either e a) -> Either e a -> Either e a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Either e a -> e -> Either e a
forall a b. a -> b -> a
const Either e a
b) a -> Either e a
forall a b. b -> Either a b
Right Either e a
a

readOrFromTextOption :: (Read a, FromText a) => Mod OptionFields a -> Parser a
readOrFromTextOption :: forall a. (Read a, FromText a) => Mod OptionFields a -> Parser a
readOrFromTextOption =
  let fromStr :: String -> Either String a
fromStr String
s = String -> Either String a
forall a. Read a => String -> Either String a
readEither String
s Either String a -> Either String a -> Either String a
forall e a. Either e a -> Either e a -> Either e a
`orElse` Text -> Either String a
forall a. FromText a => Text -> Either String a
fromText (String -> Text
T.pack String
s)
  in ReadM a -> Mod OptionFields a -> Parser a
forall a. ReadM a -> Mod OptionFields a -> Parser a
OA.option (ReadM a -> Mod OptionFields a -> Parser a)
-> ReadM a -> Mod OptionFields a -> Parser a
forall a b. (a -> b) -> a -> b
$ (String -> Either String a) -> ReadM a
forall a. (String -> Either String a) -> ReadM a
OA.eitherReader String -> Either String a
forall {a}. (Read a, FromText a) => String -> Either String a
fromStr