{-# LANGUAGE UnicodeSyntax, FlexibleContexts #-}
module GraphRewriting.Layout.PortSpec
	(module GraphRewriting.Layout.PortSpec,
	 module GraphRewriting.Layout.Position,
	 module Data.View)

import Prelude.Unicode
import GraphRewriting.Graph
import GraphRewriting.Layout.Position
import Data.View
import Data.Maybe (catMaybes)

-- | Port position relative to the node center, and the direction in which edges should stick out.
class PortSpec n where portSpec  n  [(Vector2, Vector2)]

sameDir  Vector2  (Vector2, Vector2)
sameDir r = (r,r)

portDir  PortSpec n  n  [Vector2]
portDir = map snd . portSpec

relPortPos  PortSpec n  n  [Vector2]
relPortPos = map fst . portSpec

absPortPos  (PortSpec n, View Position n)  n  [Vector2]
absPortPos n = map (examine position n +) (relPortPos n)

propOfPort  View [Port] n  (n  [a])  Edge  n  [a]
propOfPort portProps e n = catMaybes $ zipWith filterE (inspect n) (portProps n)
	where filterE edge portPos = if edge  e then Just portPos else Nothing