{-# LANGUAGE OverloadedStrings #-} module Emacs.Symbol where import Prelude() import Protolude import Emacs.Core import Data.IORef -- | All symbols -- -- obarray に設定されている全てのシンボルを取得する。 -- Use `mapatoms` functoin. 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:) -- | Symbol has four slots? 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 -- | Keyword Symbol -- | シンボルは任意の属性を持つことができる。 -- -- 属性テーブルは シンボルと任意の値に間のハッシュである。 -- ただし値として nil は設定できない。未設定とnil に設定は区別されない。 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