{-# LANGUAGE OverloadedStrings #-} module Exercise04 where import qualified Data.Text as L import Data.Char(isSpace) import Data.List(isPrefixOf) {-WETT-} xmlLight :: String -> Bool xmlLight string = not ( ">" `isPrefixOf` string) && L.null (head tags) && tagsmatching [] (tail tags) where tags = L.stripEnd . L.dropEnd 1 . L.dropWhileEnd (/='>') <$> L.splitOn "<" (L.pack string) tagsmatching [] [] = True tagsmatching _ [] = False tagsmatching [] (tag:rest) = validTag tag && not ( L.isPrefixOf "/" tag) && tagsmatching [tag] rest tagsmatching (top:stack) (tag:rest)= validTag tag && if L.isPrefixOf "/" tag then top == L.tail tag && tagsmatching stack rest else tagsmatching (tag:top:stack) rest validTag tag = not $ L.null tag || L.any isSpace tag tags string = L.stripEnd . L.dropEnd 1 . L.dropWhileEnd (/='>') <$> L.splitOn "<" (L.pack string) {-TTEW-} main = interact (show . xmlLight)