63 lines
1.3 KiB
Idris
63 lines
1.3 KiB
Idris
||| file locations
|
|
module Quox.Loc
|
|
|
|
import Text.Bounded
|
|
import Derive.Prelude
|
|
|
|
%default total
|
|
%language ElabReflection
|
|
|
|
public export
|
|
FileName : Type
|
|
FileName = String
|
|
|
|
public export
|
|
record Loc' where
|
|
constructor L
|
|
fname : FileName
|
|
startLine, startCol, endLine, endCol : Int
|
|
%name Loc' loc
|
|
%runElab derive "Loc'" [Eq, Ord, Show]
|
|
|
|
public export
|
|
Loc : Type
|
|
Loc = Maybe Loc'
|
|
|
|
export
|
|
makeLoc : FileName -> Bounds -> Loc
|
|
makeLoc fname (MkBounds {startLine, startCol, endLine, endCol}) =
|
|
Just $ L {fname, startLine, startCol, endLine, endCol}
|
|
|
|
export
|
|
onlyStart : Loc -> Loc
|
|
onlyStart Nothing = Nothing
|
|
onlyStart (Just (L fname sl sc _ _)) = Just $ L fname sl sc sl sc
|
|
|
|
export
|
|
onlyEnd : Loc -> Loc
|
|
onlyEnd Nothing = Nothing
|
|
onlyEnd (Just (L fname _ _ el ec)) = Just $ L fname el ec el ec
|
|
|
|
|
|
export
|
|
extend : Loc -> Bounds -> Loc
|
|
extend Nothing _ = Nothing
|
|
extend (Just (L fname sl1 sc1 el1 ec1)) (MkBounds sl2 sc2 el2 ec2) =
|
|
let (sl, sc) = (sl1, sc1) `min` (sl2, sc2)
|
|
(el, ec) = (el1, ec1) `max` (el2, ec2)
|
|
in
|
|
Just $ L fname sl sc el ec
|
|
|
|
export
|
|
extend' : Loc -> Maybe Bounds -> Loc
|
|
extend' l b = maybe l (extend l) b
|
|
|
|
|
|
public export
|
|
interface Located a where (.loc) : a -> Loc
|
|
|
|
export
|
|
(.bounds) : Loc -> Maybe Bounds
|
|
(Just (L {fname, startLine, startCol, endLine, endCol})).bounds =
|
|
Just $ MkBounds {startLine, startCol, endLine, endCol}
|
|
(Nothing).bounds = Nothing
|