{-# LANGUAGE BangPatterns #-} {-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_HADDOCK hide #-} -- This is an Internal module, hidden from Haddock module Core.Text.Parsing ( calculatePositionEnd, ) where import Core.Text.Rope import Data.Foldable (foldl') import qualified Data.Text.Short as S (ShortText, foldl') {- | Calculate the line number and column number of a Rope (interpreting it as if is a block of text in a file). By the convention observed by all leading brands of text editor, lines and columns are @1@ origin, so an empty Rope is position @(1,1)@. -} -- Of course, if Rope itself cached position information in the FingerTree -- monoid this would be trivial. calculatePositionEnd :: Rope -> (Int, Int) calculatePositionEnd text = let x = unRope text (l, c) = foldl' calculateChunk (1, 1) x in (l, c) calculateChunk :: (Int, Int) -> S.ShortText -> (Int, Int) calculateChunk loc piece = S.foldl' f loc piece where f :: (Int, Int) -> Char -> (Int, Int) f !(!l, !c) ch = if ch == '\n' then (l + 1, 1) else (l, c + 1)