module Step_2_5 where
import Text.Html
page = thehtml <<
[ header << (thetitle << "Output")
, body <<
[ h1 << "A poem from last time:"
, pre << poemText
, h1 << "A to do list:"
, thediv << toDoHtml
]
]
-- This time we've rewritten the lineNumbers function using "pattern matching":
poem :: String
poem = "`Twas brillig, and the slithy toves\n"
++ "Did gyre and gimble in the wabe;\n"
++ "All mimsy were the borogoves,\n"
++ "And the mome raths outgrabe.\n"
oneNumber :: Int -> String -> String
oneNumber n s = show n ++ ": " ++ s
lineNumbers :: Int -> [String] -> [String]
lineNumbers n [] = []
lineNumbers n (x:xs) = oneNumber n x : lineNumbers (n+1) xs
-- Notice that instead of a single equation (with the function name) =, there
-- are now two. Each repeats the arguments, but with patterns. Like guards, the
-- first equaltion where all the patterns match will be used.
-- Notice something else: The last expression changed:
oldWay n (x:xs) = [oneNumber n x] ++ lineNumbers (n+1) xs
newWay n (x:xs) = oneNumber n x : lineNumbers (n+1) xs
-- Rather than build a one element list (in the brackets) and concatentate (++)
-- it with the rest of the processing, the newWay just constructs (:) the new
-- result list with the element, and the list that is the recursive result.
poemText :: String
poemText = unlines $ lineNumbers 1 $ lines poem
-- NEXT
-- Here's a version of renderToDo written with guards.
-- Try converting it to using patterns:
toDoItems :: [String] -- a list of strings
toDoItems = ["Pick up avacados", "Make snacks", "Clean house", "Have party"]
renderToDo :: [String] -> [Html]
renderToDo ts
| ts == [] = []
| otherwise = [li << head ts] ++ renderToDo (tail ts)
toDoHtml :: Html
toDoHtml = ulist << renderToDo toDoItems