{-# LANGUAGE CPP #-} {-# LANGUAGE TemplateHaskell #-} #define ARG ByteString module Network.Damn.Tablumps.TH where import Data.Attoparsec.ByteString (string) import qualified Data.Attoparsec.ByteString.Char8 as C import Data.ByteString (ByteString) import Language.Haskell.TH #if __GLASGOW_HASKELL__ <= 708 import Control.Applicative #endif ary :: Int -> String -> Name -> ExpQ ary n s con = [e|do _ <- string s _ <- C.char '\t' Right <$> $(mkApps) |] where mkApps = foldl (\ a b -> [e|$(a) <*> $(b)|]) [e|pure $(conE con)|] $ replicate n [e|C.takeWhile (/= '\t') <* C.char '\t'|] -- | Tokens representing tablumps. -- -- These constructors are defined first in order of arity, then -- alphabetically. data Lump = A ARG ARG | C_A | Abbr ARG | C_Abbr | Acro ARG | C_Acro | Avatar ARG ARG | B | C_B | Bcode | C_Bcode | Br | Code | C_Code | Dev ARG ARG | Embed ARG ARG ARG | C_Embed | Emote ARG ARG ARG ARG ARG | I | C_I | Iframe ARG ARG ARG | C_Iframe | Img ARG ARG ARG | Li | C_Li | Link ARG (Maybe ARG) | Ol | C_Ol | P | C_P | S | C_S | Sub | C_Sub | Sup | C_Sup | Thumb ARG ARG ARG ARG ARG ARG | U | C_U | Ul | C_Ul deriving (Eq, Show) {-# ANN module ("HLint: ignore Use camelCase" :: String) #-}