{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-deprecated-flags #-}
module WithCli.Argument where
import Data.Orphans ()
import Prelude ()
import Prelude.Compat
import Data.List
import Data.Proxy
import Text.Read
class Argument a where
argumentType :: Proxy a -> String
parseArgument :: String -> Maybe a
instance Argument String where
argumentType :: Proxy String -> String
argumentType Proxy = "STRING"
parseArgument :: String -> Maybe String
parseArgument = String -> Maybe String
forall a. a -> Maybe a
Just
instance Argument Int where
argumentType :: Proxy Int -> String
argumentType _ = "INTEGER"
parseArgument :: String -> Maybe Int
parseArgument = String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe
instance Argument Integer where
argumentType :: Proxy Integer -> String
argumentType _ = "INTEGER"
parseArgument :: String -> Maybe Integer
parseArgument = String -> Maybe Integer
forall a. Read a => String -> Maybe a
readMaybe
instance Argument Float where
argumentType :: Proxy Float -> String
argumentType _ = "NUMBER"
parseArgument :: String -> Maybe Float
parseArgument = String -> Maybe Float
forall n. (RealFloat n, Read n) => String -> Maybe n
readFloat
instance Argument Double where
argumentType :: Proxy Double -> String
argumentType _ = "NUMBER"
parseArgument :: String -> Maybe Double
parseArgument = String -> Maybe Double
forall n. (RealFloat n, Read n) => String -> Maybe n
readFloat
readFloat :: (RealFloat n, Read n) => String -> Maybe n
readFloat :: String -> Maybe n
readFloat s :: String
s = case String -> Maybe n
forall a. Read a => String -> Maybe a
readMaybe String
s of
Just n :: n
n -> n -> Maybe n
forall a. a -> Maybe a
Just n
n
Nothing
| "." String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
s -> String -> Maybe n
forall a. Read a => String -> Maybe a
readMaybe ("0" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s)
| Bool
otherwise -> Maybe n
forall a. Maybe a
Nothing