module Emacs.Symbol where
import Prelude()
import Protolude
import Emacs.Core
import Data.IORef
allSymbols :: EmacsM [EmacsValue]
allSymbols = do
ref <- liftIO $ newIORef []
funcall1 "mapatoms" =<< mkFunctionFromCallable (accum ref)
liftIO $ readIORef ref
where
accum :: IORef [EmacsValue] -> EmacsValue -> IO ()
accum ref sym = modifyIORef ref (sym:)
setVal :: ToEmacsValue a => Text -> a -> EmacsM EmacsValue
setVal name val =
funcall2 "set" (Symbol name) val
isBounded :: Text -> EmacsM Bool
isBounded name =
isNotNil =<< funcall1 "boundp" (Symbol name)
getVal :: Text -> EmacsM (Maybe EmacsValue)
getVal name = do
bounded <- isNotNil =<< funcall1 "boundp" (Symbol name)
if bounded
then Just <$> funcall1 "symbol-value" (Symbol name)
else pure Nothing
symbolProperty :: Text -> Text -> EmacsM (Maybe EmacsValue)
symbolProperty name property = do
ev <- funcall2 "get" (Symbol name) (Symbol property)
b <- isNotNil ev
return $ if b then Just ev else Nothing
setSymbolProperty
:: (ToEmacsValue v)
=> Text
-> Text
-> v
-> EmacsM EmacsValue
setSymbolProperty name property value =
funcall3 "put" (Symbol name) (Symbol property) value