mlParseError :: String -> XmlParseError -> String
ppXmlParseError indentationStr = intercalate "\n"
  . fst
  . foldl addIndentation ([], "")
  . errMsgLines
  where
    addIndentation (ls, s) l = (ls ++ [s ++ l], s ++ indentationStr)
    errMsgLines (AttrNotFound a) =
      ["No se encontró el atributo \"" ++ a ++ "\"."]
    errMsgLines (AttrParseError a pe) =
      ["No se pudo interpretar el atributo \"" ++ a ++ "\":", ppParseError pe]
    errMsgLines (ElemNotFound e) =
      ["No se encontró el elemento \"" ++ e ++ "\"."]
    errMsgLines (ExpectedAtLeastOne e) =
      ["Se necesita al menos un \"" ++ e ++ "\"."]
    errMsgLines MalformedXML =
      ["XML malformado o inválido."]
    errMsgLines (ParseErrorInChild e xpe) =
      ("Se encontró un error en el elemento \"" ++ e ++ "\":") : errMsgLines xpe
    errMsgLines UnknownComplement =
      ["Complemento desconocido."]

signW
ppXmlParseError :: String -> XmlParseError -> String
ppXmlParseError indentationStr = intercalate "\n"
  . fst
  . foldl addIndentation ([], "")
  . errMsgLines
  where
    addIndentation (ls, s) l = (ls ++ [s ++ l], s ++ indentationStr)
    errMsgLines (AttrNotFound a) =
      ["No se encontró el atributo \"" ++ a ++ "\"."]
    errMsgLines (AttrParseError a pe) =
      ["No se pudo interpretar el atributo \"" ++ a ++ "\":", ppParseError pe]
    errMsgLines (ElemNotFound e) =
      ["No se encontró el elemento \"" ++ e ++ "\"."]
    errMsgLines (ExpectedAtLeastOne e) =
      ["Se necesita al menos un \"" ++ e ++ "\"."]
    errMsgLines MalformedXML =
      ["XML malformado o inválido."]
    errMsgLines (ParseErrorInChild e xpe) =
      ("Se encontró un error en el elemento \"" ++ e ++ "\":") : errMsgLines xpe
    errMsgLines UnknownComplement =
      ["Complemento desconocido."]
ppXmlParseError indentationStr = intercalate "\n"
  . fst
  . foldl addIndentation ([], "")
  . errMsgLines
  where
    addIndentation (ls, s) l = (ls ++ [s ++ l], s ++ indentationStr)
    errMsgLines (AttrNotFound a) =
      ["No se encontró el atributo \"" ++ a ++ "\"."]
    errMsgLines (AttrParseError a pe) =
      ["No se pudo interpretar el atributo \"" ++ a ++ "\":", ppParseError pe]
    errMsgLines (ElemNotFound e) =
      ["No se encontró el elemento \"" ++ e ++ "\"."]
    errMsgLines (ExpectedAtLeastOne e) =
      ["Se necesita al menos un \"" ++ e ++ "\"."]
    errMsgLines MalformedXML =
      ["XML malformado o inválido."]
    errMsgLines (ParseErrorInChild e xpe) =
      ("Se encontró un error en el elemento \"" ++ e ++ "\":") : errMsgLines xpe
    errMsgLines UnknownComplement =
      ["Complemento desconocido."]