glance/app/Main.hs

189 lines
5.0 KiB
Haskell
Raw Normal View History

2016-01-05 04:18:42 +03:00
{-# LANGUAGE NoMonomorphismRestriction, FlexibleContexts, TypeFamilies #-}
module Main where
import Diagrams.Prelude
import Diagrams.Backend.SVG.CmdLine
import Data.Maybe (fromMaybe)
2016-01-05 04:18:42 +03:00
2016-01-10 06:17:22 +03:00
import Data.Typeable(Typeable)
import Icons(guardIcon, colorScheme, ColorStyle(..))
import Rendering(toNames, portToPort, iconToPort, iconToIcon,
iconToIconEnds, iconHeadToPort, iconTailToPort, renderDrawing)
2016-01-21 05:24:42 +03:00
import Types(Icon(..), Drawing(..), EdgeEnd(..))
2016-01-05 04:18:42 +03:00
2016-01-21 05:24:42 +03:00
-- TODO Now --
-- todo: figure out how to deal with the difference between arrow heads and arrow tails
-- todo: consider moving portToPort etc. to a new file
-- TODO Later --
2016-01-22 00:35:34 +03:00
-- Add a small black border to lines to help distinguish line crossings.
2016-01-10 06:17:22 +03:00
-- todo: Find out how to hide unqualified names such that recursive drawings are connected correctly
2016-01-20 02:52:56 +03:00
-- todo: Find out and fix why connectinos to sub-icons need to be qualified twice (eg. "lam0" .> "arg" .> "arg")
-- todo: Rotate based on difference from ideal tangent angle, not line distance.
-- todo: Try using connectPerim for port ot port connections. Hopefully this will draw a spline.
-- todo: layout and rotate considering external connections.
-- todo: figure out local vs. global icon positions
2016-01-21 05:24:42 +03:00
(d0A, d0B, d0Res, d0Foo, d0Bar) = ("A", "B", "res", "foo", "bar")
2016-01-09 06:54:07 +03:00
d0Icons = toNames
[(d0A, Apply0Icon),
(d0B, Apply0Icon),
(d0Res, ResultIcon),
(d0Foo, TextBoxIcon d0Foo),
(d0Bar, TextBoxIcon d0Bar)
2016-01-09 04:53:12 +03:00
]
2016-01-09 06:54:07 +03:00
d0Edges =
2016-01-08 13:15:37 +03:00
[
portToPort d0A 0 d0B 2,
iconToPort d0Foo d0B 0,
iconToPort d0Res d0A 2,
iconToPort d0Foo d0B 0,
iconToPort d0Bar d0B 3,
iconToPort d0Bar d0A 3
2016-01-08 13:15:37 +03:00
]
2016-01-10 06:17:22 +03:00
drawing0 = Drawing d0Icons d0Edges []
d0Name = toName "d0"
(s1Lam, s1y, s1z, s1q) = ("lam0", "y", "z", "q")
superIcons = toNames [
(s1Lam, LambdaRegionIcon 3 d0Name),
(s1y, TextBoxIcon s1y),
(s1z, TextBoxIcon s1z),
(s1q, TextBoxIcon s1q)
2016-01-09 04:53:12 +03:00
]
superEdges =
[
portToPort (s1Lam .> d0A) 1 s1Lam 0,
iconToIcon s1y s1Lam,
iconToIcon s1z s1Lam,
iconToIcon s1q s1Lam,
iconToIcon d0A s1z,
iconToPort (s1Lam .> d0Foo .> d0Foo) s1Lam 0
2016-01-09 04:53:12 +03:00
]
--superDrawing = Drawing [((toName "lam0"), LambdaRegionIcon 3 (toName"d0"))] superEdges [((toName "d0"), drawing0)]
2016-01-09 06:54:07 +03:00
superDrawing = Drawing superIcons superEdges [(d0Name, drawing0)]
2016-01-08 13:15:37 +03:00
2016-01-10 06:17:22 +03:00
super2Icons = toNames [
(s1Lam, LambdaRegionIcon 1 d0Name),
2016-01-10 06:17:22 +03:00
--("y", TextBoxIcon "y"),
("lam1", LambdaRegionIcon 2 d0Name)
]
super2Edges =
[
iconToIcon s1Lam "lam1"
2016-01-10 06:17:22 +03:00
--iconToIcon "y" "lam0"
]
super2Drawing = Drawing super2Icons super2Edges [(d0Name, drawing0)]
super2Name = toName "s2"
super3Icons = toNames [
(s1Lam, LambdaRegionIcon 3 super2Name),
2016-01-10 06:17:22 +03:00
--("y", TextBoxIcon "y"),
("lam1", LambdaRegionIcon 4 super2Name)
2016-01-10 06:17:22 +03:00
]
super3Edges =
[
-- iconToIcon "lam0" "lam1",
iconToIcon s1Lam "A"
2016-01-10 06:17:22 +03:00
]
super3Drawing = Drawing super3Icons super2Edges [(super2Name, super2Drawing)]
(fG0, fOne, fEq0, fMinus1, fEq0Ap, fMinus1Ap, fTimes, fRecurAp, fTimesAp, fArg, fRes) =
("g0", "one", "eq0", "-1", "eq0Ap", "-1Ap", "*", "recurAp", "*Ap", "arg", "res")
2016-01-10 06:17:22 +03:00
2016-01-20 02:52:56 +03:00
fact0Icons = toNames
[
(fG0, GuardIcon 2),
(fOne, TextBoxIcon "1"),
(fEq0, TextBoxIcon "== 0"),
(fMinus1, TextBoxIcon fMinus1),
(fEq0Ap, Apply0Icon),
(fMinus1Ap, Apply0Icon),
(fTimes, TextBoxIcon fTimes),
(fRecurAp, Apply0Icon),
(fTimesAp, Apply0NIcon 2),
(fArg, BranchIcon),
(fRes, ResultIcon)
]
2016-01-20 02:52:56 +03:00
fact0Edges = [
iconToPort fEq0 fEq0Ap 0,
portToPort fEq0Ap 2 fG0 3,
iconToPort fMinus1 fMinus1Ap 0,
iconToPort fTimes fTimesAp 0,
iconToPort fOne fG0 2,
portToPort fTimesAp 1 fG0 4,
portToPort fRecurAp 2 fTimesAp 3,
iconToPort fArg fEq0Ap 1,
iconToPort fArg fMinus1Ap 1,
iconToPort fArg fTimesAp 2,
portToPort fMinus1Ap 2 fRecurAp 1,
iconToPort fRes fG0 0
]
2016-01-20 02:52:56 +03:00
fact0Drawing = Drawing fact0Icons fact0Edges []
fact0Name = toName "fac0"
factLam0Icons = toNames [
("lam0", LambdaRegionIcon 1 fact0Name),
("fac", TextBoxIcon "factorial")
]
factLam0Edges = [
iconToPort ("lam0" .> fArg .> fArg) "lam0" 0,
iconToPort "lam0" ("lam0" .> fRecurAp) 0,
2016-01-20 02:52:56 +03:00
iconToIcon "lam0" "fac"
]
factLam0Drawing = Drawing factLam0Icons factLam0Edges [(fact0Name, fact0Drawing)]
fact1Icons = toNames
[
(fG0, GuardIcon 2),
(fOne, TextBoxIcon "1"),
(fEq0, TextBoxIcon "== 0"),
(fMinus1, TextBoxIcon fMinus1),
(fTimes, TextBoxIcon fTimes),
(fRecurAp, Apply0Icon),
(fTimesAp, Apply0NIcon 2),
(fArg, BranchIcon),
(fRes, ResultIcon)
]
fact1Edges = [
iconToIconEnds fArg EndNone fEq0 EndAp1Arg,
iconTailToPort fEq0 EndAp1Result fG0 3,
iconToIconEnds fArg EndNone fMinus1 EndAp1Arg,
iconTailToPort fMinus1 EndAp1Result fRecurAp 1,
iconToPort fTimes fTimesAp 0,
iconToPort fOne fG0 2,
portToPort fTimesAp 1 fG0 4,
portToPort fRecurAp 2 fTimesAp 3,
iconToPort fArg fTimesAp 2,
iconToPort fRes fG0 0
]
fact1Drawing = Drawing fact1Icons fact1Edges []
factLam1Drawing = Drawing factLam0Icons factLam0Edges [(fact0Name, fact1Drawing)]
2016-01-09 08:52:41 +03:00
main1 :: IO ()
2016-01-09 04:53:12 +03:00
main1 = do
placedNodes <- renderDrawing factLam1Drawing
2016-01-22 00:35:34 +03:00
mainWith (placedNodes # bgFrame 1 (backgroundC colorScheme))
main2 = mainWith (guardIcon 3 # bgFrame 0.1 black)
2016-01-14 00:50:06 +03:00
2016-01-05 04:18:42 +03:00
main :: IO ()
main = main1