shell-monad-0.6.0: examples/santa.hs
{-# LANGUAGE OverloadedStrings, ExtendedDefaultRules #-}
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
import Control.Monad.Shell
import qualified Data.Text.Lazy as T
import qualified Data.Text.Lazy.IO as T
import Data.Monoid
default (T.Text)
main :: IO ()
main = T.writeFile "santa.sh" $ script $ do
hohoho <- mkHohoho
hohoho (static 1)
promptFor "What's your name?" "virginia" $ \name -> pipeLess $ do
cmd "echo" "Let's see what's in" (WithVar name (<> quote "'s")) "stocking!"
forCmd (cmd "ls" "-1" (WithVar name (quote "/home/" <>))) $ \f -> do
cmd "echo" "a shiny new" f
hohoho (static 1)
cmd "rm" "/table/cookies" "/table/milk"
hohoho (static 3)
mkHohoho :: Script (Term Static Int -> Script ())
mkHohoho = func (NamedLike "hohoho") $ do
num <- takeParameter (NamedLike "num")
forCmd (cmd "seq" (static (1 :: Int)) num) $ \_n ->
cmd "echo" "Ho, ho, ho!" "Merry xmas!"
pipeLess :: Script () -> Script ()
pipeLess c = c -|- cmd "less"
promptFor :: T.Text -> T.Text -> (Term Var String -> Script ()) -> Script ()
promptFor prompt defaultname cont = do
cmd "printf" (prompt <> " ")
var <- newVar (NamedLike prompt)
readVar var
cont =<< defaultVar var defaultname