{-# language Rank2Types , TemplateHaskell , OverloadedStrings , ExistentialQuantification , ScopedTypeVariables , GeneralizedNewtypeDeriving , FlexibleInstances , StandaloneDeriving #-} module Rasa.Internal.Buffer ( Buffer , HasBuffer(..) , text , mkBuffer ) where import Rasa.Internal.Extensions import qualified Yi.Rope as Y import Control.Lens hiding (matching) import Data.Map -- | A buffer, holds the text in the buffer and any extension states that are set on the buffer. data Buffer = Buffer { _text' :: Y.YiString , _bufExts' :: ExtMap } makeLenses ''Buffer instance HasBufExts Buffer where bufExts = bufExts' instance Show Buffer where show b = "\n" -- | This allows creation of polymorphic lenses over any type which has access to a Buffer class HasBuffer a where buffer :: Lens' a Buffer instance HasBuffer Buffer where buffer = lens id (flip const) -- | This lens focuses the text of the in-scope buffer. text :: HasBuffer b => Lens' b Y.YiString text = buffer.text' -- | Creates a new buffer from the given text. mkBuffer :: Y.YiString -> Buffer mkBuffer txt = Buffer { _text' = txt , _bufExts' = empty }