45 lines
1014 B
Haskell
Raw Normal View History

2020-06-01 22:02:16 +04:00
module Range
( Range(..)
, HasRange(..)
, diffRange
2020-06-04 13:48:04 +04:00
, cutOut
2020-06-01 22:02:16 +04:00
)
where
2020-06-04 13:48:04 +04:00
import qualified Data.ByteString as BS
import Data.ByteString (ByteString)
import Data.Text (Text)
import Data.Text.Encoding
import Pretty
2020-04-30 21:06:01 +04:00
2020-06-01 22:02:16 +04:00
-- | A continious location in text.
data Range = Range
2020-05-08 01:18:26 +04:00
{ rStart :: (Int, Int, Int) -- ^ [Start: line, col, byte-offset...
, rFinish :: (Int, Int, Int) -- ^ ... End: line, col, byte-offset).
}
deriving (Show) via PP Range
2020-05-08 01:18:26 +04:00
-- | TODO: Ugh. Purge it.
diffRange :: Range -> Range -> Range
diffRange (Range ws wf) (Range ps _) = Range (max ws ps) wf
2020-04-30 21:06:01 +04:00
instance Pretty Range where
pp (Range (ll, lc, _) (rl, rc, _)) =
brackets do
int ll <> ":" <> int lc <> "-" <> int rl <> ":" <> int rc
2020-06-01 22:02:16 +04:00
-- | Ability to get range out of something.
class HasRange a where
2020-06-04 13:48:04 +04:00
getRange :: a -> Range
-- | Extract textual representation of given range.
cutOut :: Range -> ByteString -> Text
cutOut (Range (_, _, s) (_, _, f)) bs =
decodeUtf8
$ BS.take (f - s)
$ BS.drop s
bs