{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}

module Data.Apiary.Param where

import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Text.Read
import Data.Int
import Data.Word

class Param a where
  readParam :: T.Text -> Maybe a

instance Param Char where
    readParam s | T.null s  = Nothing
                | otherwise = Just $ T.head s

instance Param Int     where readParam = readMaybe . T.unpack
instance Param Int8    where readParam = readMaybe . T.unpack
instance Param Int16   where readParam = readMaybe . T.unpack
instance Param Int32   where readParam = readMaybe . T.unpack
instance Param Int64   where readParam = readMaybe . T.unpack
instance Param Integer where readParam = readMaybe . T.unpack

instance Param Word   where readParam = readMaybe . T.unpack
instance Param Word8  where readParam = readMaybe . T.unpack
instance Param Word16 where readParam = readMaybe . T.unpack
instance Param Word32 where readParam = readMaybe . T.unpack
instance Param Word64 where readParam = readMaybe . T.unpack

instance Param Double  where readParam = readMaybe . T.unpack
instance Param Float   where readParam = readMaybe . T.unpack

instance Param T.Text where
    readParam = Just

instance Param TL.Text where
    readParam = Just . TL.fromStrict

instance Param String where
    readParam = Just . T.unpack