packages feed

hix-0.7.0: lib/Hix/Orphans/Version.hs

{-# options_ghc -Wno-orphans #-}

module Hix.Orphans.Version where

import Distribution.Version (
  LowerBound (LowerBound),
  UpperBound (NoUpperBound, UpperBound),
  Version,
  VersionInterval (VersionInterval),
  VersionRange,
  asVersionIntervals,
  earlierVersion,
  intersectVersionRanges,
  mkVersion,
  orLaterVersion,
  unionVersionRanges,
  version0,
  versionNumbers,
  )
import GHC.Exts (IsList (..))

instance IsList Version where
  type Item Version = Int

  fromList = mkVersion

  toList = versionNumbers

instance IsList VersionRange where
  type Item VersionRange = Version

  fromList = \case
    [] -> orLaterVersion version0
    [v] -> orLaterVersion v
    [l, u] -> range l u
    l : u : rest -> unionVersionRanges (range l u) (fromList rest)
    where
      range l u = intersectVersionRanges (orLaterVersion l) (earlierVersion u)

  toList range = do
    VersionInterval (LowerBound v _) upper <- asVersionIntervals range
    v : fromUpper upper
    where
      fromUpper = \case
        NoUpperBound -> []
        UpperBound v _ -> [v]