import Criterion.Main
import qualified Data.Text.IO as TIO
import Control.DeepSeq
import qualified Text.HTML.TagSoup as Soup
import qualified Text.HTML.Parser as Me

main :: IO ()
main = do
    t <- TIO.readFile "test.html"
    defaultMain
        [ bgroup "Forced"
            [ bench "tagsoup fast Text" $ nf (Soup.parseTagsOptions Soup.parseOptionsFast) t
            , bench "tagsoup normal Text" $ nf (Soup.parseTagsOptions Soup.parseOptions) t
            , bench "html-parser" $ nf Me.parseTokens t
            ]
        , bgroup "length"
            [ bench "tagsoup fast Text" $ whnf (length . Soup.parseTagsOptions Soup.parseOptionsFast) t
            , bench "tagsoup normal Text" $ whnf (length . Soup.parseTagsOptions Soup.parseOptions) t
            , bench "html-parser" $ whnf (length . Me.parseTokens) t
            ]
        ]

instance NFData t => NFData (Soup.Tag t) where
    rnf (Soup.TagOpen t attrs) = rnf t `seq` rnf attrs `seq` ()
    rnf (Soup.TagClose t)      = rnf t `seq` ()
    rnf (Soup.TagText t)       = rnf t `seq` ()
    rnf (Soup.TagComment t)    = rnf t `seq` ()
    rnf (Soup.TagWarning t)    = rnf t `seq` ()
    rnf (Soup.TagPosition _ _) = ()