{-# OPTIONS -fglasgow-exts #-} module Examples where import Data.List (sort) import Interface.TV.UI -- To pick up the FunArr instance for OFun. GHC bug? import Interface.TV.OFun() main = runBoth shopping -- Run both UI and IO flavors runBoth :: CTV a -> IO () runBoth tv = runUI tv >> runIO tv tv0 :: CTV String tv0 = tv (oTitle "message" stringOut) "Hello World!" tv1 :: CTV Int tv1 = tv (oTitle "answer" showOut) (42 :: Int) reverseT :: DefaultOut ([a] -> [a]) => CTV ([a] -> [a]) reverseT = tv (oTitle "reverse" defaultOut) reverse -- This one reverses twice revTwice :: CTV (String -> String) revTwice = reverseT ->| reverseT apples, bananas :: CInput Int apples = iTitle "apples" defaultIn bananas = iTitle "bananas" defaultIn total :: Show a => COutput a total = oTitle "total" showOut shoppingO :: COutput (Int -> Int -> Int) shoppingO = oTitle "shopping list" $ oLambda apples (oLambda bananas total) shopping :: CTV (Int -> Int -> Int) shopping = tv shoppingO (+) shoppingPr :: CTV ((Int,Int) -> Int) shoppingPr = tv ( oTitle "shopping list -- curried" $ oLambda (iPair apples bananas) total ) (uncurry (+)) shoppingPr' :: CTV ((Int,Int) -> Int) shoppingPr' = uncurryA $$ shopping applesU, bananasU :: Input UI Int applesU = iTitle "apples" (islider 3 (0,10)) bananasU = iTitle "bananas" (islider 7 (0,10)) shoppingUO :: Output UI (Int -> Int -> Int) shoppingUO = oTitle "shopping list" $ oLambda applesU (oLambda bananasU total) shoppingU :: TV UI (Int -> Int -> Int) shoppingU = tv shoppingUO (+) shoppingPrU :: TV UI ((Int,Int) -> Int) shoppingPrU = uncurryA $$ shoppingU -- This one is polymorphic in value, so say something like -- "runBoth (sortT :: CTV ([String] -> [String]))". If you leave out the type -- annotation, a will default to Int. sortT :: (Read a, Show a, Ord a) => CTV ([a] -> [a]) sortT = tv (oTitle "sort" $ interactLineRS []) sort ---- Composition. -- Idea: unwords, sort, words instance DefaultOut [String] where defaultOut = showOut instance DefaultIn [String] where defaultIn = readIn [] wordsT :: CTV (String -> [String]) wordsT = tv ( oTitle "function: words" $ oLambda (iTitle "sentence in" defaultIn) (oTitle "words out" defaultOut)) words unwordsT :: CTV ([String] -> String) unwordsT = tv ( oTitle "function: unwords" $ oLambda (iTitle "words in" defaultIn) (oTitle "sentence out" defaultOut)) unwords sortWordsT :: CTV (String -> String) sortWordsT = wordsT ->| sortT ->| unwordsT ---- IO examples testO :: Output KIO (String -> String) testO = oLambda (fileIn "test.txt") defaultOut -- Apply a function on the lines or on the words of a string. onLines, onWords :: ([String] -> [String]) -> (String -> String) onLines = wrapF unlines lines onWords = wrapF unwords words perLine,perWord :: (String -> String) -> (String -> String) perLine f = onLines (map f) perWord f = onWords (map f) -- io3, ... :: TV KIO (String -> String) io3 = tv testO (onLines reverse) -- reverse the lines io4 = tv testO (onWords reverse) -- reverse words io5 = tv testO (perLine (onWords reverse)) -- reverse words on each line io3' = tv testO (perLine reverse) -- reverse each line io4' = tv testO (perWord reverse) -- reverse each word io5' = tv testO (perLine (perWord reverse)) -- reverse each word, leaving lines -- Find lines with 0 < length < n short :: Int -> [String] -> [String] short n = filter (tween 1 n . length) where tween lo hi i = lo <= i && i < hi -- Extract lines from a file before a function and combine lines after. shortO :: FilePath -> Output KIO ([String] -> [String]) shortO path = oLambda (fmap lines (fileIn path)) (cofmap unlines defaultOut) -- Nearly equivalent, but retains more Output structure: -- shortO path = cofmap (wrapF unlines lines) (oLambda (fileIn path) defaultOut) shortT :: FilePath -> Int -> TV KIO ([String] -> [String]) shortT path n = tv (shortO path) (sort . short n) -- Example: runTV (shortT "c:/conal/Misc/quotes.tw" 100)