-- | A wrapper for SrcSpans that is ordered.
module Language.Haskell.Tools.AST.Utils.OrdSrcSpan where

import FastString (FastString(..))
import SrcLoc

-- | Wraps the SrcSpan into an ordered source span
ordSrcSpan :: SrcSpan -> OrdSrcSpan
ordSrcSpan (RealSrcSpan sp) = OrdSrcSpan sp
ordSrcSpan (UnhelpfulSpan fs) = NoOrdSrcSpan fs

-- | Unwrap the ordered source span
fromOrdSrcSpan :: OrdSrcSpan -> SrcSpan 
fromOrdSrcSpan (OrdSrcSpan sp) = RealSrcSpan sp
fromOrdSrcSpan (NoOrdSrcSpan fs) = UnhelpfulSpan fs

-- | A wrapper for SrcSpans that is ordered.
data OrdSrcSpan 
  = OrdSrcSpan RealSrcSpan
  | NoOrdSrcSpan FastString
  deriving (Show, Eq)

instance Ord OrdSrcSpan where
  compare (NoOrdSrcSpan _) (NoOrdSrcSpan _) = EQ
  compare (OrdSrcSpan _) (NoOrdSrcSpan _) = GT
  compare (NoOrdSrcSpan _) (OrdSrcSpan _) = LT
  compare (OrdSrcSpan rsp1)  (OrdSrcSpan rsp2) 
    = compare (realSrcSpanStart rsp1) (realSrcSpanStart rsp2)
        `mappend` compare (realSrcSpanEnd rsp1) (realSrcSpanEnd rsp2)