From d385c4a5333bb1bca9def0e900c06f6ebe287753 Mon Sep 17 00:00:00 2001 From: Jon Kristensen Date: Sat, 23 Jul 2011 23:08:31 +0200 Subject: [PATCH] implemented a xmpp version datatype, a parsec validator and parser, and ord and show functions --- Network/XMPP/Stream.hs | 63 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/Network/XMPP/Stream.hs b/Network/XMPP/Stream.hs index f4b7781..7adc5ac 100644 --- a/Network/XMPP/Stream.hs +++ b/Network/XMPP/Stream.hs @@ -458,6 +458,69 @@ messageTypeToString Normal = "normal" messageTypeToString (OtherMessageType s) = s +data Version = Version { majorVersion :: Integer + , minorVersion :: Integer } deriving (Eq) + + +-- Version numbers are displayed as ".". + +instance Show Version where + show (Version major minor) = (show major) ++ "." ++ (show minor) + + +-- If the major version numbers are the same, compare the minor versions. +-- Otherwise, compare the major version numbers. + +instance Ord Version where + compare (Version major aminor) (Version major bminor) = compare aminor bminor + compare (Version amajor _) (Version bmajor _) = compare amajor bmajor + + +-- Converts a "." numeric version number to a "Version" object. + +versionFromString :: String -> Maybe Version + +versionFromString s = case parse version "" (DBC.pack s) of + Right version -> Just version + Left _ -> Nothing + + +-- Constructs a "Version" based on the major and minor version numbers. + +versionFromNumbers :: Integer -> Integer -> Version + +versionFromNumbers major minor = Version major minor + + +languageTag :: GenParser Char st LangTag + +languageTag = do + + -- Read until we reach a '-' character, or EOF. This is the `primary tag'. + primTag <- tag + + -- Read zero or more subtags. + subTags <- subtags + eof + + return $ LangTag primTag subTags + where + + subtags :: GenParser Char st [String] + subtags = many $ do + char '-' + subtag <- tag + return subtag + + tag :: GenParser Char st String + tag = do + a <- many1 $ oneOf tagChars + return a + + tagChars :: [Char] + tagChars = ['a'..'z'] ++ ['A'..'Z'] + + data LangTag = LangTag { primaryTag :: String , subtags :: [String] }