+ expandRange [s, l] = Iv s (s + l - 1)
+
+
+tidyIntervals :: [Interval] -> [Interval]
+tidyIntervals = tidyIntervalsS . sort
+
+tidyIntervalsS :: [Interval] -> [Interval]
+tidyIntervalsS [] = []
+tidyIntervalsS [x] = [x]
+tidyIntervalsS (x:y:xs)
+ | x `allBelow` y = x : tidyIntervalsS (y:xs)
+ | otherwise = tidyIntervalsS ((x `merge` y) : xs)
+
+allBelow :: Interval -> Interval -> Bool
+allBelow (Iv _ x2) (Iv y1 _) = (x2 + 1) < y1
+
+merge :: Interval -> Interval -> Interval
+merge (Iv x1 x2) (Iv y1 y2) = Iv (min x1 y1) (max x2 y2)
+