twitch alternatives and similar packages
Based on the "System" category.
Alternatively, view twitch alternatives based on common mentions on social networks and blogs.
-
taffybar
A gtk based status bar for tiling window managers such as XMonad -
nix-deploy
Deploy software or an entire NixOS system configuration to another NixOS system -
optparse-generic
Auto-generate a command-line parser for your datatype -
hapistrano
Deploy tool for Haskell applications, like Capistrano for Rails -
ghc-hotswap
Example code for how we swap compiled code within a running Haskell process. -
typed-process
Alternative API for processes, featuring more type safety -
openssh-github-keys
DEPRECATED: Control SSH access to your servers via GitHub teams -
atomic-write
Writes files atomically in Haskell while preserving permissions -
system-fileio
Contains the system-filepath and system-fileio packages -
plugins
Dynamic linking and runtime evaluation of Haskell, and C, including dependency chasing and package resolution. -
language-puppet
A library to work with Puppet manifests, test them and eventually replace everything ruby. -
ascii-progress
A simple Haskell progress bar for the console. Heavily borrows from TJ Holowaychuk's Node.JS project -
directory-contents
Recursively build a tree of directory contents, avoiding symlink cycles -
splitmix
Pure Haskell implementation of SplitMix pseudo-random number generator
WorkOS - The modern identity platform for B2B SaaS
Do you think we are missing an alternative of twitch or a related project?
README
Twitch is monadic DSL and library for file watching. It conveniently utilizes 'do' notation in the style of Shake and clay to expose the functionality of the fsnotify cross-platform file system watcher.
Here is an example that converts Markdown files to Html and reloads Safari whenever the input files change.
{-# LANGUAGE OverloadedStrings #-}
import Twitch
import System.Process ( system )
main = defaultMain $ do
"*.md" |> \filePath -> system ("pandoc -t html " ++ filePath)
"*.html" |> \_ -> system "osascript refreshSafari.AppleScript"
Rules are specified in the Dep
(for Dependency) monad. The library takes advantage
of the OverloadedStrings extension to create a Dep
value from a glob pattern.
After creating a Dep
value using a glob, event callbacks are added using prefix
or infix API.
There are three types of events, add, modify and delete. In many cases, the add and modify responses are the same, so an 'add and modify' API is provided
In the example above an 'add and modify' callback was added to both the ".md"
and ".html" globs using the |>
operator.
All this is the common case, differing callbacks can be added with |+
(or add
)
and |%
(or modify
) functions. Finally, delete callbacks are added with
|-
(of delete
).
Here is a more complex usage example, handling all three events seperately.
handleHaskellFiles :: Dep
handleHaskellFiles = "src/**/*.hs" |+ addToCabalFile |% reloadFile |- removeFromCabalFile
Here is another complex example, using the named addModify
and delete
callbacks
to the same function, which build a pdf and a Word document using pandoc, and
refreshes a mupdf window.
buildPDFandWordandRefreshWindow _ = do
pdfLatexCode <- system "pdflatex --interaction errorstopmode -file-line-error -halt-on-error document.tex"
(pandocCode,pandocOut,pandocErr) <- readProcessWithExitCode "pandoc" [ "--from=latex" , "--to=docx" , "document.tex" , "-o" , "document.docx" ] ""
(xwininfoCode,xwininfoOut,xwininfoErr) <- readProcessWithExitCode "xwininfo" ["-root", "-int", "-all"] ""
let windowId = head . words . head . filter (isInfixOf "document") $ lines xwininfoOut
(xDoToolCode,xDoToolOut,xDoToolErr) <- readProcessWithExitCode "xdotool" ["key", "--window", windowId, "r"] ""
return ()
main :: IO ()
main = defaultMain $ do
addModify buildPDFandWordandRefreshWindow "src/**/*.tex"
delete buildPDFandWordandRefreshWindow "src/**/*.tex"
The globs in the above two examples are also more complicated and incorporate recursive wildcards. For complete documentation on the glob syntax, consult the Glob library's documentation.
Since a command pattern is calling system commands with a file path, a useful addition to twitch is the file-command-qq quasiquoter, which is the package of the same name.
Here is a slightly more complicated version the example from earlier, using the file-command-qq quasiquoter.
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
import Twitch
import FileCommand
main = defaultMain $ do
"*.md" |> [s|pandoc -t html -o$directory$basename-test.html $path|]
"*.html" |> [s|osascript refreshSafari.AppleScript|]
For an alternative command line interface take a look at twitch-cli