The woot package

[Tags:library, mit, test]

Without operation transform - WOOT.

[Skip to Readme]


Dependencies base (<=5), vector [details]
License MIT
Author Tyler Olson
Category Data
Home page
Bug tracker
Source repository head: git clone
Uploaded Fri Aug 5 03:20:48 UTC 2016 by tgolson
Distributions NixOS:
Downloads 551 total (18 in the last 30 days)
0 []
Status Docs available [build log]
Last success reported on 2016-08-05 [all 1 reports]
Hackage Matrix CI




Maintainer's Corner

For package maintainers and hackage trustees

Readme for woot

Readme for woot-


Core library for creating real time collaborative documents without Operational transformation (WOOT). This package provides the core logic and data types for building a server capable and handling real time editing with WOOT.

Real time group editors without Operational transformation


$ stack install woot


stack test



Here is a small example of how one would use this library to create a server that keeps an internal WootClient and updates the client upon request.

Each time the server receives a POST request with an Operation in the JSON body, it will apply that operation to a cached WootClient instance, and then update the cache. This server could easily receive many updates from many other clients, and reliably process the operations.

import Control.Concurrent.STM
import Data.Aeson
import Data.IORef
import Data.Woot
import Network.HTTP.Types.Status
import Network.Wai
import Network.Wai.Handler.Warp

-- ...
-- FromJSON instances for Operation and other necessary types

makeEmptyClient :: IO (IORef WootClient)
makeEmptyClient = newIORef $ makeWootClientEmpty 1

wootApp :: IORef WootClient -> Application
wootApp clientRef req respond = do
    body <- requestBody req

    let mOperation = decodeStrict body

    case mOperation of
        Nothing -> return ()
        Just operation -> do
            client <- readIORef clientRef
            let newClient = sendOperation client operation
            _ <- writeIORef clientRef newClient
            putStrLn $ "Updated Client: " ++ show (wootClientString newClient)

    respond $ responseLBS status200 [] "WOOOOT!"

runWootApp :: IO ()
runWootApp = makeEmptyClient >>= run 8000 . wootApp


  • ci
  • docs
  • examples