2016-01-23 05:29:46 +03:00
|
|
|
{-# LANGUAGE NoMonomorphismRestriction, FlexibleContexts, TypeFamilies #-}
|
|
|
|
|
|
|
|
module Util (
|
|
|
|
portToPort,
|
|
|
|
iconToPort,
|
|
|
|
iconToIcon,
|
|
|
|
iconToIconEnds,
|
2016-02-05 08:53:21 +03:00
|
|
|
--iconHeadToPort,
|
2016-01-23 05:29:46 +03:00
|
|
|
iconTailToPort,
|
2016-02-05 08:53:21 +03:00
|
|
|
toNames,
|
|
|
|
noEnds,
|
|
|
|
nameAndPort,
|
2016-02-08 05:01:57 +03:00
|
|
|
justName,
|
|
|
|
fromMaybeError
|
2016-01-23 05:29:46 +03:00
|
|
|
)where
|
|
|
|
|
|
|
|
import Control.Arrow(first)
|
|
|
|
import Diagrams.Prelude(IsName, toName, Name)
|
2016-02-08 05:01:57 +03:00
|
|
|
import Data.Maybe(fromMaybe)
|
2016-01-23 05:29:46 +03:00
|
|
|
|
2016-02-05 08:53:21 +03:00
|
|
|
import Types(EdgeEnd(..), Edge(..), NameAndPort(..))
|
2016-01-23 05:29:46 +03:00
|
|
|
|
|
|
|
mapFst :: (a -> b) -> [(a, c)] -> [(b, c)]
|
|
|
|
mapFst f = map (first f)
|
|
|
|
|
|
|
|
toNames :: (IsName a) => [(a, b)] -> [(Name, b)]
|
|
|
|
toNames = mapFst toName
|
|
|
|
|
2016-01-23 06:42:15 +03:00
|
|
|
noEnds :: (EdgeEnd, EdgeEnd)
|
2016-01-23 05:29:46 +03:00
|
|
|
noEnds = (EndNone, EndNone)
|
|
|
|
|
2016-02-05 08:53:21 +03:00
|
|
|
nameAndPort :: IsName a => a -> Int -> NameAndPort
|
|
|
|
nameAndPort n p = NameAndPort (toName n) (Just p)
|
|
|
|
|
|
|
|
justName :: IsName a => a -> NameAndPort
|
|
|
|
justName n = NameAndPort (toName n) Nothing
|
|
|
|
|
2016-01-23 05:29:46 +03:00
|
|
|
-- Edge constructors --
|
|
|
|
portToPort :: (IsName a, IsName b) => a -> Int -> b -> Int -> Edge
|
2016-02-05 08:53:21 +03:00
|
|
|
portToPort a b c d = Edge (nameAndPort a b, nameAndPort c d) noEnds
|
2016-01-23 05:29:46 +03:00
|
|
|
|
|
|
|
iconToPort :: (IsName a, IsName b) => a -> b -> Int -> Edge
|
2016-02-05 08:53:21 +03:00
|
|
|
iconToPort a c d = Edge (justName a, nameAndPort c d) noEnds
|
2016-01-23 05:29:46 +03:00
|
|
|
|
|
|
|
iconToIcon :: (IsName a, IsName b) => a -> b -> Edge
|
2016-02-05 08:53:21 +03:00
|
|
|
iconToIcon a c = Edge (justName a, justName c) noEnds
|
2016-01-23 05:29:46 +03:00
|
|
|
|
|
|
|
|
|
|
|
-- If there are gaps between the arrow and the icon, try switching the first two arguments
|
|
|
|
-- with the last two arguments
|
|
|
|
iconToIconEnds :: (IsName a, IsName b) => a -> EdgeEnd -> b -> EdgeEnd -> Edge
|
2016-02-05 08:53:21 +03:00
|
|
|
iconToIconEnds a b c d = Edge (justName a, justName c) (b, d)
|
2016-01-23 05:29:46 +03:00
|
|
|
|
2016-02-05 08:53:21 +03:00
|
|
|
-- iconHeadToPort :: (IsName a, IsName b) => a -> EdgeEnd -> b -> Int -> Edge
|
|
|
|
-- iconHeadToPort a endHead c d = Edge (justName a, nameAndPort c d) (EndNone, endHead)
|
2016-01-23 05:29:46 +03:00
|
|
|
|
2016-01-23 06:42:15 +03:00
|
|
|
iconTailToPort :: (IsName a, IsName b) => a -> EdgeEnd -> b -> Int -> Edge
|
2016-02-05 08:53:21 +03:00
|
|
|
iconTailToPort a endTail c d = Edge (justName a, nameAndPort c d) (endTail, EndNone)
|
2016-02-08 05:01:57 +03:00
|
|
|
|
|
|
|
fromMaybeError :: String -> Maybe a -> a
|
|
|
|
fromMaybeError s = fromMaybe (error s)
|