packages feed

shell-monad-0.2.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 (Val 1)

	promptFor "What's your name?" $ \name -> pipeLess $ do
		cmd "echo" "Let's see what's in" (val name <> quote "'s") "stocking!"
		forCmd (cmd "ls" "-1" (quote "/home/" <> val name)) $ \f -> do
			cmd "echo" "a shiny new" f
			hohoho (Val 1)

	cmd "rm" "/table/cookies" "/table/milk"
	hohoho (Val 3)

mkHohoho :: Script (Val Int -> Script ())
mkHohoho = func (NamedLike "hohoho") $ do
	num <- takeParameter (NamedLike "num")
	forCmd (cmd "seq" "1" num) $ \_n ->
		cmd "echo" "Ho, ho, ho!" "Merry xmas!"

pipeLess :: Script () -> Script ()
pipeLess c = c -|- cmd "less"

promptFor :: T.Text -> (Var -> Script ()) -> Script ()
promptFor prompt cont = do
	cmd "printf" (prompt <> " ")
	var <- newVar (NamedLike prompt)
	readVar var
	cont var