module Rasa.Internal.Editor
  (
  
  Editor
  , HasEditor(..)
  , buffers
  , exiting
  , nextBufId
  , BufRef(..)
  ) where
import Rasa.Internal.Buffer
import Rasa.Internal.Extensions
import Data.Default
import Data.IntMap
import Control.Lens
newtype BufRef =
  BufRef Int
  deriving (Show, Eq, Ord)
data Editor = Editor
  { _buffers' :: IntMap Buffer
  , _exiting' :: Bool
  , _extState' :: ExtMap
  , _nextBufId' :: Int
  }
makeLenses ''Editor
instance Show Editor where
  show ed =
    "Buffers==============\n" ++ show (ed^.buffers) ++ "\n\n"
    ++ "Editor Extensions==============\n" ++ show (ed^.exts) ++ "\n\n"
    ++ "---\n\n"
class HasEditor a where
  editor :: Lens' a Editor
buffers :: HasEditor e => Lens' e (IntMap Buffer)
buffers = editor.buffers'
exiting :: HasEditor e => Lens' e Bool
exiting = editor.exiting'
nextBufId :: HasEditor e => Lens' e Int
nextBufId = editor.nextBufId'
instance HasEditor Editor where
  editor = lens id (flip const)
instance HasExts Editor where
  exts = extState'
instance Default Editor where
  def =
    Editor
    { _extState'=def
    , _buffers'=empty
    , _exiting'=False
    , _nextBufId'=0
    }