yi-0.4.6: Yi/UI/Utils.hs
-- Copyright (C) 2008 JP Bernardy
module Yi.UI.Utils where
-- Utilities shared by various UIs
import Yi.Buffer
import Yi.Buffer.HighLevel
import Yi.Prelude
import Prelude (Ordering(..))
import Yi.Window
import Control.Arrow (second)
-- | return index of Sol on line @n@ above current line
indexOfSolAbove :: Int -> BufferM Point
indexOfSolAbove n = savingPointB $ do
gotoLnFrom (negate n)
pointB
-- | Transform (scroll) the window so that the point is visible.
moveWinTosShowPoint :: FBuffer -> Window -> FBuffer
moveWinTosShowPoint b w = result
where (_, result) = runBuffer w b $
do ln <- curLn
let gap = min (ln-1) (height w `div` 2)
i <- indexOfSolAbove gap
f <- fromMark <$> askMarks
setMarkPointB f i
return ()
-- | Turn a sequence of (from,style,to) strokes into a sequence
-- of picture points (from,style), taking special care to
-- ensure that the points are strictly increasing and introducing
-- padding segments where neccessary.
-- Precondition: Strokes are ordered and not overlapping.
strokePicture :: [(Point,(a -> a),Point)] -> [(Point,(a -> a))]
strokePicture [] = []
strokePicture wholeList@((leftMost,_,_):_) = helper leftMost wholeList
where helper :: Point -> [(Point,(a -> a),Point)] -> [(Point,(a -> a))]
helper prev [] = [(prev,id)]
helper prev ((l,f,r):xs)
| prev < l = (prev, id) : (l,f) : helper r xs
| otherwise = (l,f) : helper r xs
-- | Paint the given stroke-picture on top of an existing picture
paintStrokes :: (a -> a) -> a -> [(Point,(a -> a))] -> [(Point,a)] -> [(Point,a)]
paintStrokes f0 _ [] lx = fmap (second f0) lx
paintStrokes _ x0 lf [] = fmap (second ($ x0)) lf
paintStrokes f0 x0 lf@((pf,f):tf) lx@((px,x):tx) =
case pf `compare` px of
LT -> (pf, f x0):paintStrokes f x0 tf lx
EQ -> (pf, f x ):paintStrokes f x tf tx
GT -> (px, f0 x ):paintStrokes f0 x lf tx
paintPicture :: a -> [[(Point,(a -> a),Point)]] -> [(Point,a)]
paintPicture a = foldr (paintStrokes id a . strokePicture) []