packages feed

haste-0.1: src/Haste/Types.hs

{-# 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