||| 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