summaryrefslogtreecommitdiff
path: root/testsuite/tests/programs/barton-mangler-bug/Plot.lhs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/programs/barton-mangler-bug/Plot.lhs')
-rw-r--r--testsuite/tests/programs/barton-mangler-bug/Plot.lhs79
1 files changed, 79 insertions, 0 deletions
diff --git a/testsuite/tests/programs/barton-mangler-bug/Plot.lhs b/testsuite/tests/programs/barton-mangler-bug/Plot.lhs
new file mode 100644
index 0000000000..8db1066aef
--- /dev/null
+++ b/testsuite/tests/programs/barton-mangler-bug/Plot.lhs
@@ -0,0 +1,79 @@
+The functions in this file (well, the single function) will allow the
+user to plot different functions using the Gnuplot program. In fact,
+all it really does is output a number of points on the list and allow
+the user to activate Gnuplot and use the plotting program to get the
+appropriate output.
+
+The first line just gives the module name. For the moment, I don't
+anticipate using any modules (although this may change).
+
+> module Plot where
+
+Now we give the type of the function. This consists of a file name, a
+list of values, and a function that goes from the appropriate types.
+
+> plot2d:: (Fractional a, Fractional b, Ord a, Ord b, Show a, Show b)
+> => String -> [(a, b)] -> [a] -> (a -> b) -> String
+> plot2d fl expected inp f = plot2d' expected inp f
+
+> plot2d':: (Fractional a, Fractional b, Ord a, Ord b, Show a, Show b)
+> => [(a, b)] -> [a] -> (a -> b) -> String
+> plot2d' [] [] f = []
+> plot2d' ((e1, e2):es) (x:xs) f
+> | (e1 `isSame` x) && (e2 `isSame` x')
+> = (show e1) ++
+> " " ++
+> (show e2) ++
+> "\n" ++
+> plot2d' es xs f
+> | otherwise
+> = "Mismatch: " ++
+> (show e1) ++
+> " " ++
+> (show e2) ++
+> " " ++
+> (show x) ++
+> " " ++
+> (show x') ++
+> "\n" ++
+> plot2d' es xs f
+> where x' = f x
+> plot2d' es [] _ = "Extra expected: " ++ show es
+> plot2d' [] xs _ = "Extra results: " ++ show xs
+
+> isSame :: (Fractional a, Ord a) => a -> a -> Bool
+> x `isSame` y = abs (x - y) < 0.00001
+
+And now, let's create a function to make a range out of a triple of a
+start point, an end point, and an increment.
+
+> createRange:: (Num a, Ord a) => a -> a -> a -> [a]
+> createRange s e i = if s > e then []
+> else s : createRange (s+i) e i
+
+We now settle down to a couple of more specific functions that do
+things that are more unique to gnuplot. First, we have something that
+creates the appropriate gnuplot command file.
+
+> createGnuPlot:: Show a => String -> a -> a -> String
+> createGnuPlot fl s e =
+> "set terminal latex\n" ++
+> "set output \"" ++
+> (fl ++ ".tex\"\n") ++
+> "set nokey\n" ++
+> "plot [" ++
+> (show s) ++
+> ":" ++
+> (show e) ++
+> "] \"" ++
+> (fl ++ ".plt\"") ++
+> " with lines\n"
+
+And now we create a fairly specific plotExam function that takes a
+string, a function, and two floats and produces the correct files
+
+> plotExam:: String -> [(Float, Float)] -> Float -> Float -> (Float -> Float)
+> -> String
+> plotExam fl expected s e f = plot2d (fl++".plt") expected r f ++
+> createGnuPlot fl s e
+> where r = createRange s e ((e - s) / 2500)