module Rasa.Ext.Files
( files
, save
) where
import qualified Data.Text.IO as TIO
import System.Environment
import Data.Typeable
import Data.Default
import Data.Maybe
import Control.Monad
import Control.Monad.Trans
import qualified Yi.Rope as Y
import Rasa.Ext
import Rasa.Ext.Views
import Rasa.Ext.Cmd
data FileInfo =
FileInfo (Maybe String)
deriving (Typeable, Show, Eq)
instance Default FileInfo where
def = FileInfo Nothing
type Filename = String
data FileStatus =
Dirty
| Clean
deriving Show
instance Default FileStatus where
def = Clean
getFileStatus :: BufAction FileStatus
getFileStatus = getBufExt
setFileStatus :: FileStatus -> BufAction ()
setFileStatus = setBufExt
getFilename :: BufAction (Maybe Filename)
getFilename = do
FileInfo filename <- getBufExt
return filename
files :: App ()
files = do
onEveryNewBuffer_ $ do
void . onBufTextChanged $ bufferChanged
void . addTopStatus $ fileStatus
void . addTopStatus $ (fmap Y.fromString <$> getFilename)
afterInit $ do
loadFiles
addCmd "save" $ focusDo_ . saveAs
fileStatus :: BufAction (Maybe RenderInfo)
fileStatus = do
hasFilename <- isJust <$> getFilename
status <- getFileStatus
if hasFilename
then return . Just $
case status of
Dirty -> styleText "✘" $ fg Red
Clean -> styleText "✓" $ fg Green
else return Nothing
bufferChanged :: BufTextChanged -> BufAction ()
bufferChanged _ = setFileStatus Dirty
saveAs :: String -> BufAction ()
saveAs fName = getText >>= liftIO . TIO.writeFile fName . Y.toText
save :: BufAction ()
save = do
FileInfo mName <- getBufExt
case mName of
Just fName -> saveAs fName
Nothing -> return ()
setFileStatus Clean
setFilename :: String -> BufAction ()
setFilename fname = setBufExt $ FileInfo (Just fname)
addFile :: String -> Y.YiString -> App ()
addFile fname txt = do
newBuf <- addBuffer txt
bufDo_ newBuf (setFilename fname)
loadFiles :: App ()
loadFiles = do
fileNames <- liftIO getArgs
fileTexts <- liftIO $ traverse TIO.readFile fileNames
mapM_ (uncurry addFile) $ zip fileNames (Y.fromText <$> fileTexts)