on 62bed13 help sign in
elk/src/Reporting/Region.hs
73 lines 1.5 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2module Reporting.Region where
4import Data.Aeson ((.=))
5import qualified Data.Aeson as Json
6import qualified Text.Parsec.Pos as Parsec
9data Region = Region
10 { start :: Position
11 , end :: Position
12 }
13 deriving (Show)
16data Position = Position
17 { line :: Int
18 , column :: Int
19 }
20 deriving (Show)
23fromSourcePos :: Parsec.SourcePos -> Position
24fromSourcePos sourcePos =
25 Position
26 (Parsec.sourceLine sourcePos)
27 (Parsec.sourceColumn sourcePos)
30merge :: Region -> Region -> Region
31merge (Region start _) (Region _ end) =
32 Region start end
35-- TO STRING
37toString :: Region -> String
38toString (Region start end) =
39 let posToString pos =
40 "(line " ++ show (line pos) ++
41 ", column " ++ show (column pos) ++ ")"
42 in
43 posToString start ++ " to " ++ posToString end
46toPrettyString :: Region -> String
47toPrettyString (Region start end) =
48 case line start == line end of
49 False ->
50 "between lines " ++ show (line start)
51 ++ " and " ++ show (line end)
53 True ->
54 "on line " ++ show (line end) ++ ", column "
55 ++ show (column start) ++ " to " ++ show (column end)
58-- JSON
60instance Json.ToJSON Region where
61 toJSON (Region start end) =
62 Json.object
63 [ "start" .= start
64 , "end" .= end
65 ]
68instance Json.ToJSON Position where
69 toJSON (Position line column) =
70 Json.object
71 [ "line" .= line
72 , "column" .= column
73 ]