    {-# LANGUAGE ConstraintKinds #-}

    -- | This module extends "Data.Version" with extra utilities.
    --   The package also exports the existing "Data.Version" functions.
    module Data.Version.Extra(
        module Data.Version,
        readVersion
        ) where

    import Partial
    import Data.Version
    import Data.List.Extra
    import Text.ParserCombinators.ReadP

    -- | Read a 'Version' or throw an exception.
    --
    -- > \x -> readVersion (showVersion x) == x
    -- > readVersion "hello" == undefined
    readVersion :: Partial => String -> Version
    readVersion s =
        case [ x | (x,"") <- readP_to_S parseVersion $ trimEnd s] of
            [x] -> x
            []  -> error "Data.Version.Extra.readVersion: no parse"
            _   -> error "Data.Version.Extra.readVersion: ambiguous parse"