Fix goToLine when line number is negative
authorEvgenii Akentev <i@ak3n.com>
Sun, 9 Jul 2023 14:56:12 +0000 (18:56 +0400)
committerEvgenii Akentev <i@ak3n.com>
Sun, 9 Jul 2023 14:56:12 +0000 (18:56 +0400)
src/System/IO/LineIndexedCursor.hs
test/Main.hs

index 14d62cd7a32c5609473f104c3a76de5f1273d7ff..10e2819f9c219d63a3328f29ec599e174d955427 100644 (file)
@@ -83,8 +83,9 @@ getCurrentLineNumber' CursorHandle{..} = do
   pure cln
 
 goToLine' :: CursorHandle -> Integer -> IO Integer
-goToLine' CursorHandle{..} ln = do
-  modifyMVar linesIdx $ \(idx, size, _) -> do
+goToLine' ch@CursorHandle{..} ln =
+  if (ln < 0) then getCurrentLineNumber' ch
+  else modifyMVar linesIdx $ \(idx, size, _) -> do
     if ln > size then do
       hSeek fileHandle AbsoluteSeek (idx !! 0)
       -- try to read until the requested line number
index 8e002ecf812e2bac33152abc4ef92e1bfeab8853..9e74031fc56aa424873e6d46183cefc218f49c87 100644 (file)
@@ -29,6 +29,13 @@ main = hspec $ do
         l <- getCurrentLine c
         l `shouldBe` Just "Sed elementum velit sit amet orci mollis tincidunt."
 
+      it "goToLine is negative" $ \(_, c) -> do
+        ln <- goToLine c (-10)
+        ln `shouldBe` 0
+
+        l <- getCurrentLine c
+        l `shouldBe` Just "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
+
       it "goToLine is too big" $ \(_, c) -> do
         l <- getCurrentLine c
         l `shouldBe` Just "Lorem ipsum dolor sit amet, consectetur adipiscing elit."