packages feed

cabal-db-0.1.10: Src/Ver.hs

module Ver
    ( Ver(..)
    , ver
    , versionMajor
    ) where

import Data.String
import Data.List

newtype Ver = Ver String -- [Int]
    deriving (Eq)

instance Ord Ver where
    compare (Ver v1) (Ver v2) = compareVer v1 v2

compareVer v1 v2 =
    case (break (== '.') v1, break (== '.') v2) of
        (("",_),("",_))   -> EQ
        (("",_),_)        -> LT
        (_,("",_))        -> GT
        ((i1,r1),(i2,r2)) | i1 == i2  -> compareVer (dropDot r1) (dropDot r2)
                          | otherwise -> compare (read i1 :: Int) (read i2)
  where dropDot s | s == []       = s
                  | head s == '.' = drop 1 s
                  | otherwise     = s

ver :: [Int] -> Ver
ver [] = error "empty version"
ver l  = Ver $ intercalate "." $ map show l

versionMajor :: Ver -> Maybe (Int,Int)
versionMajor (Ver l) =
    case toInts l of
        a:b:_ -> Just (a,b)
        _     -> Nothing

instance Show Ver where
    show (Ver s) = s

instance IsString Ver where
    fromString s = Ver s

toInts :: String -> [Int]
toInts verstr = loop verstr
  where loop s = case break (== '.') s of
            (v, '.':xs) -> read v : loop xs
            (v, "")     -> [read v]
            (_, _)      -> error ("cannot parse version: " ++ show verstr)