glance/app/Main.hs

75 lines
3.1 KiB
Haskell
Raw Normal View History

2016-01-05 04:18:42 +03:00
{-# LANGUAGE NoMonomorphismRestriction, FlexibleContexts, TypeFamilies #-}
module Main where
import Prelude hiding (return)
2016-01-05 04:18:42 +03:00
2016-05-10 09:45:37 +03:00
-- Note: (#) and (&) are hidden in all Glance source files, since they would require
-- - an special case when translating when Glance is run on its own source code.
import Diagrams.Prelude hiding ((#), (&))
2016-01-05 04:18:42 +03:00
import Diagrams.Backend.SVG.CmdLine
2016-02-24 10:14:00 +03:00
import qualified Language.Haskell.Exts as Exts
2016-05-29 06:53:51 +03:00
import Icons(ColorStyle(..), colorScheme, multilineComment)
import Rendering(renderDrawing)
import Translate(drawingsFromModule)
2016-02-24 10:14:00 +03:00
2016-01-05 04:18:42 +03:00
2016-01-21 05:24:42 +03:00
-- TODO Now --
2016-05-10 09:45:37 +03:00
-- Fix icon nesting if a non-nestable icon (eg. flatLambdaIcon) is part of the expression.
-- - eg. y = f $ g (\x -> x)
2016-01-21 05:24:42 +03:00
-- TODO Later --
-- Add documentation.
2016-05-10 09:45:37 +03:00
2016-03-28 02:49:58 +03:00
-- Visual todos:
-- Fix rotation missing edges to nested diagrams.
2016-05-10 09:45:37 +03:00
-- Don't rotate text and nested icons, give them rectangualar bounding boxes in GraphViz. (Perhaps use a typeclass for isRotateAble)
-- Give lines a black border to make line crossings easier to see.
-- Give lines that cross the border of a lambda function a special color.
2016-03-28 02:49:58 +03:00
-- Line intersections should have a small circle. This could probably be done with
-- a line ending.
-- Let each bool, value pair in Guard icon be flipped to reduce line crossings. Do the same for case.
-- Let lines connect to ports in multiple locations (eg. case value, or guard result)
-- Rotate icons based on the outgoing line's difference from ideal angle, not line distance.
-- Improve line routing. Draw curved lines with outgoing lines at fixed angles.
-- - connectPerim might be useful for this.
2016-05-10 09:45:37 +03:00
-- For nested apply, cycle through different colors and line styles (eg. dashed, solid, wavy)
-- - for each nesting level. This will help distinguish what is an argument to which funciton.
-- Investigate arrows not being drawn
-- Translate todos:
2016-05-10 09:45:37 +03:00
-- Make nested version of FlatLambdaIcon
-- Fix test case x of {0 -> 1; y -> y}.
-- Add proper RecConstr, and RecUpdate support.
-- Eliminate BranchIcon in Alts.
2016-02-10 09:29:07 +03:00
-- Eliminate BranchIcon for the identity funciton "y x = x"
-- Add a maximum nesting depth.
-- Special case for otherwise.
2016-03-28 02:49:58 +03:00
renderFile :: String -> String -> IO (Diagram B)
renderFile inputFilename includeComments = do
parseResult <- Exts.parseFileWithComments
(Exts.defaultParseMode
{Exts.extensions = [Exts.EnableExtension Exts.MultiParamTypeClasses, Exts.EnableExtension Exts.FlexibleContexts],
Exts.parseFilename = inputFilename
})
inputFilename
2016-02-24 10:14:00 +03:00
let
(parsedModule, comments) = Exts.fromParseResult parseResult
2016-02-24 10:14:00 +03:00
drawings = drawingsFromModule parsedModule
print parsedModule
print "\n\n"
2016-02-25 01:46:49 +03:00
--print drawings
2016-02-24 10:14:00 +03:00
diagrams <- traverse renderDrawing drawings
2016-02-24 10:14:00 +03:00
let
2016-05-29 06:53:51 +03:00
commentsInBoxes = fmap (\(Exts.Comment _ _ c) -> alignL $ multilineComment white (opaque white) c) comments
diagramsAndComments = vsep 2 $ zipWith (\x y -> x === strutY 0.4 === y) commentsInBoxes (fmap alignL diagrams)
justDiagrams = vsep 1 $ fmap alignL diagrams
diagramsAndMaybeComments = if includeComments == "c" then diagramsAndComments else justDiagrams
print comments
pure (bgFrame 1 (backgroundC colorScheme) diagramsAndMaybeComments :: Diagram B)
2016-02-24 10:14:00 +03:00
2016-01-05 04:18:42 +03:00
main :: IO ()
main = mainWith renderFile