{-# LANGUAGE ExistentialQuantification #-} module Haste.Types ( HM , Args , URLString , Description , Language (..) , PasteProvider (..) , SomePasteProvider (..) , HasteOptions (..) , HasteEnvironment (..) , languageOptionName ) where import Data.Char (toLower) import Control.Monad.Reader import qualified Data.Char as Char type HM = ReaderT HasteEnvironment IO type URLString = String type Args = [String] type Description = String data Language = Text | Haskell | Bash | C | Java | Perl | Python deriving (Eq, Enum, Bounded, Show, Read) class (Show a) => PasteProvider a where paste :: a -> String -> HM URLString optionName :: a -> String optionName = map toLower . show preferredLanguages :: a -> [Language] preferredLanguages _ = [] data SomePasteProvider = forall a. PasteProvider a => SomePasteProvider a instance Show SomePasteProvider where show (SomePasteProvider p) = show p instance PasteProvider SomePasteProvider where paste (SomePasteProvider p) = paste p optionName (SomePasteProvider p) = optionName p preferredLanguages (SomePasteProvider p) = preferredLanguages p data HasteOptions = HasteOptions { optProvider :: Maybe SomePasteProvider , optLanguage :: Maybe Language , optHelp :: Bool } deriving (Show) data HasteEnvironment = HasteEnvironment { envContent :: String , envLanguage :: Language } deriving (Show, Eq) languageOptionName :: Language -> String languageOptionName = map toLower . show