packages feed

yi-0.3: Yi/History.hs

{-# LANGUAGE PatternSignatures, DeriveDataTypeable #-}

-- Copyright (c) 2005,2007,2008 Jean-Philippe Bernardy

-- "command history" implementation

module Yi.History where

import Yi.Buffer
import Data.Char
import Data.List
import Data.Dynamic
import Yi.Dynamic
import Yi.Editor
import Yi.Accessor

data History = History {_historyCurrent :: Int,
                        _historyContents :: [String]}

    deriving (Show, Typeable)
instance Initializable History where
    initial = (History (-1) [])


historyUp :: EditorM ()
historyUp = historyMove 1

historyDown :: EditorM ()
historyDown = historyMove (-1)

historyStart :: EditorM ()
historyStart = do
  (History _cur cont) <- getA dynA
  setA dynA (History 0 (nub ("":cont)))
  debugHist

historyFinish :: EditorM ()
historyFinish = do
  (History _cur cont) <- getA dynA
  curValue <- withBuffer0 elemsB
  setA dynA $ History (-1) (nub $ dropWhile null $ (curValue:cont))

-- TODO: scrap
debugHist :: EditorM ()
debugHist = return ()

historyMove :: Int -> EditorM ()
historyMove delta = do
  (History cur cont) <- getA dynA
  curValue <- withBuffer0 elemsB
  let len = length cont
      next = cur + delta
      nextValue = cont !! next
  case (next < 0, next >= len) of
    (True, _) -> printMsg "end of history, no next item."
    (_, True) -> printMsg "beginning of history, no previous item."
    (_,_) -> do
         setA dynA (History next (take cur cont ++ [curValue] ++ drop (cur+1) cont))
         debugHist
         withBuffer0 $ do
              sz <- sizeB
              moveTo 0
              deleteN sz
              insertN nextValue