content: {-# LANGUAGE ConstraintKinds #-}
  {-# LANGUAGE FlexibleContexts #-}
  
  -- | Functions for manipulating 'FFI.SourceRange's, which represent a range of
  -- locations in the source code between two points.
  --
  -- This module is intended to be imported qualified.
  module Clang.Range
  (
  
  -- * Creating ranges
    create
  , createInvalid
  
  -- * Analyzing ranges
  , getStart
  , getEnd
  , isInvalid
  
  ) where
  
  import Control.Monad.IO.Class
  
  import qualified Clang.Internal.FFI as FFI
  import Clang.Internal.Monad
  import System.IO.Unsafe (unsafePerformIO)
  
  -- | Creates a 'FFI.SourceRange' representing the range between two locations.
  create :: ClangBase m
         => FFI.SourceLocation s'   -- ^ Starting location.
         -> FFI.SourceLocation s''  -- ^ Ending location.
         -> ClangT s m (FFI.SourceRange s)
  create from to = liftIO $ FFI.getRange mkProxy from to
  
  -- | Creates an invalid 'FFI.SourceRange'.
  createInvalid :: ClangBase m => ClangT s m (FFI.SourceRange s)
  createInvalid = liftIO $ FFI.getNullRange mkProxy
  
  -- | Retrieves the beginning of the given range.
  getStart :: ClangBase m => FFI.SourceRange s' -> ClangT s m (FFI.SourceLocation s)
  getStart sr = liftIO $ FFI.getRangeStart mkProxy sr
  
  -- | Retrieves the end of the given range.
  getEnd :: ClangBase m => FFI.SourceRange s' -> ClangT s m (FFI.SourceLocation s)
  getEnd sr = liftIO $ FFI.getRangeEnd mkProxy sr
  
  -- | Returns 'True' if the given range is invalid.
  isInvalid :: FFI.SourceRange s' -> Bool
  isInvalid r = unsafePerformIO $ FFI.range_isNull r
  