Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

lua-vr/unionmount-co-log

Open more actions menu

Repository files navigation

unionmount

Haskell library to "union mount" a bunch of folders onto an in-memory data structure, and keeping the latter in sync as the files change over time. Used in Ema and Emanote.

Usage

Both the mount and unionMount functions return a tuple value of type Dynamic, giving direct access to the initial value as well as the updater function that may be run in a separate thread. See how Ema uses it for an illustration.

Here's a simple example of loading Markdown files onto a TVar of Map FilePath Text (file contents keyed by path).

import System.UnionMount qualified as UM
import Data.Map.Strict qualified as Map

main :: IO ()
main = do
  runStdoutLoggingT $ do
    let baseDir = "/Users/srid/Documents/Notebook"
    (model0, modelF) <- UM.mount baseDir (one ((), "*.md")) [] mempty (const $ handlePathUpdate baseDir)
    modelVar <- newTVarIO model0
    modelF $ \newModel -> do
      atomically $ writeTVar modelVar newModel

handlePathUpdate ::
  (MonadIO m) =>
  FilePath -> FilePath -> UM.FileAction () -> m (Map FilePath Text -> Map FilePath Text)
handlePathUpdate baseDir path action = do
  case action of
    UM.Refresh _ _ -> do
      s <- decodeUtf8 <$> readFileBS (baseDir </> path)
      pure $ Map.insert path s
    UM.Delete -> do
      pure $ Map.delete path

Examples

See this example illustrating mounting a directory of Markdown files into (effectively) a Map FilePath String. A more involved example from Emanote demonstrates the "union" aspect of the library.

About

Union mount in Haskell, with fsnotify and co-log

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Contributors 2

  •  
  •  
Morty Proxy This is a proxified and sanitized view of the page, visit original site.