module Rasa.Ext.Views.Internal.LineNumbers
  ( lineNumbers
  , enableLineNumbers
  , disableLineNumbers
  , toggleLineNumbers
  , checkLineNumbers
  ) where

import Rasa.Ext

import Rasa.Ext.Views.Internal.Widgets
import Data.Default
import qualified Yi.Rope as Y

newtype LineNumbers =
  LineNumbers Bool
  deriving Show

instance Default LineNumbers where
  def = LineNumbers True

enableLineNumbers :: BufAction ()
enableLineNumbers = setBufExt $ LineNumbers True

disableLineNumbers :: BufAction ()
disableLineNumbers = setBufExt $ LineNumbers False

toggleLineNumbers :: BufAction ()
toggleLineNumbers = overBufExt $
  \(LineNumbers b) -> LineNumbers $ not b

-- | Returns whether line numbers are currently enabled.
checkLineNumbers :: BufAction Bool
checkLineNumbers = do
  LineNumbers b <- getBufExt
  return b

lineNumbers :: App ()
lineNumbers = onEveryNewBuffer_ . addLeftBar $ do
  enabled <- checkLineNumbers
  if enabled
     then Just <$> getLineNumbers
     else return Nothing
  where
    getLineNumbers = do
      numLines <- Y.countNewLines <$> getText
      return . Y.unlines $ Y.fromString . show <$> [1.. numLines + 1]