{-# 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? -- | 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