woot: Real time group editor without operational transform.

[ data, library, mit ] [ Propose Tags ]

Without operation transform - WOOT.

[Skip to Readme]


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS],,,,,,
Dependencies base (<=5), vector [details]
License MIT
Author Tyler Olson
Maintainer tydotg@gmail.com
Category Data
Home page https://github.com/TGOlson/woot-haskell
Bug tracker https://github.com/TGOlson/woot-haskell/issues
Source repo head: git clone https://github.com/TGOlson/woot-haskell
Uploaded by tgolson at 2016-08-05T03:20:48Z
Distributions NixOS:
Reverse Dependencies 1 direct, 0 indirect [details]
Downloads 4202 total (18 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2016-08-05 [all 1 reports]

Readme for woot-

[back to package description]


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