{-# LANGUAGE ScopedTypeVariables #-}
--------------------------------------------------------------------------------
-- |
-- Module      :  Data.PlaneGraph.Draw
-- Copyright   :  (C) Frank Staals
-- License     :  see the LICENSE file
-- Maintainer  :  Frank Staals
--
-- Helper functions to draw a PlaneGraph in ipe
--
--------------------------------------------------------------------------------
module Data.PlaneGraph.Draw where

import           Control.Lens
import           Data.Ext
import qualified Data.Foldable as F
import           Data.Geometry.LineSegment
import           Data.Geometry.Polygon
import           Data.Maybe (mapMaybe)
import           Data.PlaneGraph
import           Ipe

--------------------------------------------------------------------------------

-- | Draws only the values for which we have a Just attribute
drawPlaneGraph :: forall s r. (Fractional r, Ord r)
               => IpeOut (PlaneGraph s (Maybe (IpeAttributes IpeSymbol r))
                                       (Maybe (IpeAttributes Path  r))
                                       (Maybe (IpeAttributes Path  r))
                           r) Group r
drawPlaneGraph :: IpeOut
  (PlaneGraph
     s
     (Maybe (IpeAttributes IpeSymbol r))
     (Maybe (IpeAttributes Path r))
     (Maybe (IpeAttributes Path r))
     r)
  Group
  r
drawPlaneGraph = IpeOut'
  Maybe
  (VertexId' s,
   VertexData
     r
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size])))
  IpeSymbol
  r
-> IpeOut'
     Maybe
     (Dart s,
      LineSegment
        2
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size]))
        r
      :+ Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     Path
     r
-> IpeOut'
     Maybe
     (FaceId' s,
      SimplePolygon
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size]))
        r
      :+ Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     Path
     r
-> IpeOut'
     Maybe
     (FaceId' s,
      MultiPolygon
        (Maybe
           (Maybe
              (Attributes'
                 r
                 '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                    'Size])))
        r
      :+ Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     Path
     r
-> IpeOut
     (PlaneGraph
        s
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size]))
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
        r)
     Group
     r
forall k (vi :: * -> *) (ei :: * -> *) (fi :: * -> *) r (s :: k) v
       e f.
(ToObject vi, ToObject ei, ToObject fi, Fractional r, Ord r) =>
IpeOut' Maybe (VertexId' s, VertexData r v) vi r
-> IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
-> IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
-> IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
-> IpeOut (PlaneGraph s v e f r) Group r
drawPlaneGraphWith IpeOut'
  Maybe
  (VertexId' s,
   VertexData
     r
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size])))
  IpeSymbol
  r
(VertexId' s, VertexData r (Maybe (IpeAttributes IpeSymbol r)))
-> Maybe (IpeObject' IpeSymbol r)
fv IpeOut'
  Maybe
  (Dart s,
   LineSegment
     2
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     r
   :+ Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
  Path
  r
forall (f :: * -> *) g a.
(Functor f, HasDefaultIpeOut g) =>
(a,
 g :+ f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))))
-> f (DefaultIpeOut g (NumType g)
      :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
fe IpeOut'
  Maybe
  (FaceId' s,
   SimplePolygon
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     r
   :+ Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
  Path
  r
forall (f :: * -> *) g a.
(Functor f, HasDefaultIpeOut g) =>
(a,
 g :+ f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))))
-> f (DefaultIpeOut g (NumType g)
      :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
ff IpeOut'
  Maybe
  (FaceId' s,
   MultiPolygon
     (Maybe
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size])))
     r
   :+ Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
  Path
  r
forall (f :: * -> *) g a.
(Functor f, HasDefaultIpeOut g) =>
(a,
 g :+ f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))))
-> f (DefaultIpeOut g (NumType g)
      :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
ff
  where
    fv                     :: (VertexId' s, VertexData r (Maybe (IpeAttributes IpeSymbol r)))
                           -> Maybe (IpeObject' IpeSymbol r)
    fv :: (VertexId' s, VertexData r (Maybe (IpeAttributes IpeSymbol r)))
-> Maybe (IpeObject' IpeSymbol r)
fv (VertexId' s
_,VertexData Point 2 r
p Maybe (IpeAttributes IpeSymbol r)
ma) = (\Attributes'
  r
  '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
     'Size]
a -> IpeOut
  (Point 2 r) (DefaultIpeOut (Point 2 r)) (NumType (Point 2 r))
forall g.
HasDefaultIpeOut g =>
IpeOut g (DefaultIpeOut g) (NumType g)
defIO Point 2 r
p IpeObject' IpeSymbol r
-> IpeAttributes IpeSymbol r -> IpeObject' IpeSymbol r
forall (i :: * -> *) r.
IpeObject' i r -> IpeAttributes i r -> IpeObject' i r
! Attributes'
  r
  '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
     'Size]
IpeAttributes IpeSymbol r
a) (Attributes'
   r
   '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
      'Size]
 -> IpeSymbol r
    :+ Attributes'
         r
         '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
            'Size])
-> Maybe
     (Attributes'
        r
        '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
           'Size])
-> Maybe
     (IpeSymbol r
      :+ Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe
  (Attributes'
     r
     '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
        'Size])
Maybe (IpeAttributes IpeSymbol r)
ma -- draws a point
    fe :: (a,
 g :+ f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))))
-> f (DefaultIpeOut g (NumType g)
      :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
fe (a
_,g
s :+ f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
ma)         = (\Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
a -> IpeOut g (DefaultIpeOut g) (NumType g)
forall g.
HasDefaultIpeOut g =>
IpeOut g (DefaultIpeOut g) (NumType g)
defIO g
s (DefaultIpeOut g (NumType g)
 :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
-> Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
-> DefaultIpeOut g (NumType g)
   :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
forall (i :: * -> *) r.
IpeObject' i r -> IpeAttributes i r -> IpeObject' i r
! Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
a) (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
 -> DefaultIpeOut g (NumType g)
    :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
-> f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
-> f (DefaultIpeOut g (NumType g)
      :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
ma -- draw segment
    ff :: (a,
 g :+ f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))))
-> f (DefaultIpeOut g (NumType g)
      :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
ff (a
_,g
f :+ f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
ma)         = (\Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
a -> IpeOut g (DefaultIpeOut g) (NumType g)
forall g.
HasDefaultIpeOut g =>
IpeOut g (DefaultIpeOut g) (NumType g)
defIO g
f (DefaultIpeOut g (NumType g)
 :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
-> Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
-> DefaultIpeOut g (NumType g)
   :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
forall (i :: * -> *) r.
IpeObject' i r -> IpeAttributes i r -> IpeObject' i r
! Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
a) (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g))
 -> DefaultIpeOut g (NumType g)
    :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
-> f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
-> f (DefaultIpeOut g (NumType g)
      :+ Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f (Attributes' (NumType g) (AttributesOf (DefaultIpeOut g)))
ma -- draw a face

-- | Draw everything using the defaults
drawPlaneGraph'    :: forall s v e f r. (Ord r, Fractional r)
                   => IpeOut (PlaneGraph s v e f r) Group r
drawPlaneGraph' :: IpeOut (PlaneGraph s v e f r) Group r
drawPlaneGraph' PlaneGraph s v e f r
pg = IpeOut
  (PlaneGraph
     s
     (Maybe (IpeAttributes IpeSymbol r))
     (Maybe (IpeAttributes Path r))
     (Maybe (IpeAttributes Path r))
     r)
  Group
  r
forall k (s :: k) r.
(Fractional r, Ord r) =>
IpeOut
  (PlaneGraph
     s
     (Maybe (IpeAttributes IpeSymbol r))
     (Maybe (IpeAttributes Path r))
     (Maybe (IpeAttributes Path r))
     r)
  Group
  r
drawPlaneGraph
  (PlaneGraph s v e f r
pgPlaneGraph s v e f r
-> (PlaneGraph s v e f r
    -> PlaneGraph
         s
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))
         e
         f
         r)
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     e
     f
     r
forall a b. a -> (a -> b) -> b
&(Vector v
 -> Identity
      (Vector
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))))
-> PlaneGraph s v e f r
-> Identity
     (PlaneGraph
        s
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size]))
        e
        f
        r)
forall k (s :: k) v e f r v'.
Lens
  (PlaneGraph s v e f r)
  (PlaneGraph s v' e f r)
  (Vector v)
  (Vector v')
vertexData((Vector v
  -> Identity
       (Vector
          (Maybe
             (Attributes'
                r
                '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                   'Size]))))
 -> PlaneGraph s v e f r
 -> Identity
      (PlaneGraph
         s
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))
         e
         f
         r))
-> ((v
     -> Identity
          (Maybe
             (Attributes'
                r
                '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                   'Size])))
    -> Vector v
    -> Identity
         (Vector
            (Maybe
               (Attributes'
                  r
                  '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                     'Size]))))
-> (v
    -> Identity
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size])))
-> PlaneGraph s v e f r
-> Identity
     (PlaneGraph
        s
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size]))
        e
        f
        r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(v
 -> Identity
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
               'Size])))
-> Vector v
-> Identity
     (Vector
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size])))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse   ((v
  -> Identity
       (Maybe
          (Attributes'
             r
             '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                'Size])))
 -> PlaneGraph s v e f r
 -> Identity
      (PlaneGraph
         s
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))
         e
         f
         r))
-> Attributes'
     r
     '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
        'Size]
-> PlaneGraph s v e f r
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     e
     f
     r
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (IpeAttributes IpeSymbol r
forall a. Monoid a => a
mempty :: IpeAttributes IpeSymbol r)
     PlaneGraph
  s
  (Maybe
     (Attributes'
        r
        '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
           'Size]))
  e
  f
  r
-> (PlaneGraph
      s
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
               'Size]))
      e
      f
      r
    -> PlaneGraph
         s
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
         f
         r)
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     f
     r
forall a b. a -> (a -> b) -> b
&(Vector (Dart s, e)
 -> Identity
      (Vector
         (Dart s,
          Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))))
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     e
     f
     r
-> Identity
     (PlaneGraph
        s
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size]))
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
        f
        r)
forall k (s :: k) v e f r e'.
Lens
  (PlaneGraph s v e f r)
  (PlaneGraph s v e' f r)
  (Vector (Dart s, e))
  (Vector (Dart s, e'))
dartData((Vector (Dart s, e)
  -> Identity
       (Vector
          (Dart s,
           Maybe
             (Attributes'
                r
                '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                   'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                   'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))))
 -> PlaneGraph
      s
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
               'Size]))
      e
      f
      r
 -> Identity
      (PlaneGraph
         s
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
         f
         r))
-> ((e
     -> Identity
          (Maybe
             (Attributes'
                r
                '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                   'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                   'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
    -> Vector (Dart s, e)
    -> Identity
         (Vector
            (Dart s,
             Maybe
               (Attributes'
                  r
                  '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                     'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                     'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))))
-> (e
    -> Identity
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     e
     f
     r
-> Identity
     (PlaneGraph
        s
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size]))
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
        f
        r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.((Dart s, e)
 -> Identity
      (Dart s,
       Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
               'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
               'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
-> Vector (Dart s, e)
-> Identity
     (Vector
        (Dart s,
         Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse(((Dart s, e)
  -> Identity
       (Dart s,
        Maybe
          (Attributes'
             r
             '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
 -> Vector (Dart s, e)
 -> Identity
      (Vector
         (Dart s,
          Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))))
-> ((e
     -> Identity
          (Maybe
             (Attributes'
                r
                '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                   'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                   'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
    -> (Dart s, e)
    -> Identity
         (Dart s,
          Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
-> (e
    -> Identity
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
-> Vector (Dart s, e)
-> Identity
     (Vector
        (Dart s,
         Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(e
 -> Identity
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
               'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
               'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
-> (Dart s, e)
-> Identity
     (Dart s,
      Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
forall s t a b. Field2 s t a b => Lens s t a b
_2  ((e
  -> Identity
       (Maybe
          (Attributes'
             r
             '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
 -> PlaneGraph
      s
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
               'Size]))
      e
      f
      r
 -> Identity
      (PlaneGraph
         s
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
         f
         r))
-> Attributes'
     r
     '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
        'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
        'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     e
     f
     r
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     f
     r
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (IpeAttributes Path r
forall a. Monoid a => a
mempty :: IpeAttributes Path      r)
     PlaneGraph
  s
  (Maybe
     (Attributes'
        r
        '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
           'Size]))
  (Maybe
     (Attributes'
        r
        '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
           'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
           'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
  f
  r
-> (PlaneGraph
      s
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
               'Size]))
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
               'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
               'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
      f
      r
    -> PlaneGraph
         s
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
         r)
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     r
forall a b. a -> (a -> b) -> b
&(Vector f
 -> Identity
      (Vector
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))))
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     f
     r
-> Identity
     (PlaneGraph
        s
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size]))
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
        r)
forall k (s :: k) v e f r f'.
Lens
  (PlaneGraph s v e f r)
  (PlaneGraph s v e f' r)
  (Vector f)
  (Vector f')
faceData((Vector f
  -> Identity
       (Vector
          (Maybe
             (Attributes'
                r
                '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                   'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                   'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))))
 -> PlaneGraph
      s
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
               'Size]))
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
               'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
               'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
      f
      r
 -> Identity
      (PlaneGraph
         s
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
         r))
-> ((f
     -> Identity
          (Maybe
             (Attributes'
                r
                '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                   'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                   'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
    -> Vector f
    -> Identity
         (Vector
            (Maybe
               (Attributes'
                  r
                  '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                     'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                     'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))))
-> (f
    -> Identity
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     f
     r
-> Identity
     (PlaneGraph
        s
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                 'Size]))
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
        r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(f
 -> Identity
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
               'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
               'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
-> Vector f
-> Identity
     (Vector
        (Maybe
           (Attributes'
              r
              '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                 'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                 'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse     ((f
  -> Identity
       (Maybe
          (Attributes'
             r
             '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient])))
 -> PlaneGraph
      s
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
               'Size]))
      (Maybe
         (Attributes'
            r
            '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
               'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
               'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
      f
      r
 -> Identity
      (PlaneGraph
         s
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
                  'Size]))
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
         (Maybe
            (Attributes'
               r
               '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
                  'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
                  'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
         r))
-> Attributes'
     r
     '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
        'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
        'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     f
     r
-> PlaneGraph
     s
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Pen,
              'Size]))
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     (Maybe
        (Attributes'
           r
           '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Stroke, 'Fill, 'Dash,
              'Pen, 'LineCap, 'LineJoin, 'FillRule, 'Arrow, 'RArrow,
              'StrokeOpacity, 'Opacity, 'Tiling, 'Gradient]))
     r
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ (IpeAttributes Path r
forall a. Monoid a => a
mempty :: IpeAttributes Path      r))


-- | Function to draw a graph by giving functions that specify how to
-- render vertices, edges, and faces.
drawPlaneGraphWith                 :: (ToObject vi, ToObject ei, ToObject fi, Fractional r, Ord r)
                                   => IpeOut' Maybe (VertexId' s, VertexData r v)          vi r
                                   -> IpeOut' Maybe (Dart s,      LineSegment 2 v r :+ e)  ei r
                                   -> IpeOut' Maybe (FaceId' s,   SimplePolygon v r :+ f)  fi r
                                   -> IpeOut' Maybe (FaceId' s,   MultiPolygon (Maybe v) r :+ f)   fi r
                                   -> IpeOut (PlaneGraph s v e f r) Group r
drawPlaneGraphWith :: IpeOut' Maybe (VertexId' s, VertexData r v) vi r
-> IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
-> IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
-> IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
-> IpeOut (PlaneGraph s v e f r) Group r
drawPlaneGraphWith IpeOut' Maybe (VertexId' s, VertexData r v) vi r
fs IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
fe IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
fif IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
fof PlaneGraph s v e f r
g = FaceId' s
-> IpeOut' Maybe (VertexId' s, VertexData r v) vi r
-> IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
-> IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
-> IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
-> IpeOut (PlaneGraph s v e f r) Group r
forall k (vi :: * -> *) (ei :: * -> *) (fi :: * -> *) r (s :: k) v
       e f.
(ToObject vi, ToObject ei, ToObject fi, Num r, Ord r) =>
FaceId' s
-> IpeOut' Maybe (VertexId' s, VertexData r v) vi r
-> IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
-> IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
-> IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
-> IpeOut (PlaneGraph s v e f r) Group r
drawPlaneGraphWith' (PlaneGraph s v e f r -> FaceId' s
forall k r (s :: k) v e f.
(Ord r, Fractional r) =>
PlaneGraph s v e f r -> FaceId' s
outerFaceId PlaneGraph s v e f r
g) IpeOut' Maybe (VertexId' s, VertexData r v) vi r
fs IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
fe IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
fif IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
fof PlaneGraph s v e f r
g

-- | Function to draw a graph by giving the outer faceId and the
-- functions that specify how to render vertices, edges, and faces.
drawPlaneGraphWith'                    :: (ToObject vi, ToObject ei, ToObject fi, Num r, Ord r)
                                      => FaceId' s -- ^ outerface Id
                                      -> IpeOut' Maybe (VertexId' s, VertexData r v)          vi r
                                      -> IpeOut' Maybe (Dart s,      LineSegment 2 v r :+ e)  ei r
                                      -> IpeOut' Maybe (FaceId' s,   SimplePolygon v r :+ f)  fi r
                                      -> IpeOut' Maybe (FaceId' s,   MultiPolygon (Maybe v) r :+ f)   fi r
                                      -> IpeOut (PlaneGraph s v e f r) Group r
drawPlaneGraphWith' :: FaceId' s
-> IpeOut' Maybe (VertexId' s, VertexData r v) vi r
-> IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
-> IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
-> IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
-> IpeOut (PlaneGraph s v e f r) Group r
drawPlaneGraphWith' FaceId' s
i IpeOut' Maybe (VertexId' s, VertexData r v) vi r
fv IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
fe IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
fif IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
fof PlaneGraph s v e f r
g = [IpeObject r]
-> Group r
   :+ Attributes
        (AttrMapSym1 r) '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Clip]
forall (f :: * -> *) r.
Foldable f =>
IpeOut (f (IpeObject r)) Group r
ipeGroup ([IpeObject r]
 -> Group r
    :+ Attributes
         (AttrMapSym1 r) '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Clip])
-> ([[IpeObject r]] -> [IpeObject r])
-> [[IpeObject r]]
-> Group r
   :+ Attributes
        (AttrMapSym1 r) '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Clip]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[IpeObject r]] -> [IpeObject r]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[IpeObject r]]
 -> Group r
    :+ Attributes
         (AttrMapSym1 r) '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Clip])
-> [[IpeObject r]]
-> Group r
   :+ Attributes
        (AttrMapSym1 r) '[ 'Layer, 'Matrix, 'Pin, 'Transformations, 'Clip]
forall a b. (a -> b) -> a -> b
$ [[IpeObject r]
vs, [IpeObject r]
es, [IpeObject r]
ifs, [IpeObject r]
of']
  where
    ((FaceId' s, MultiPolygon (Maybe v) r :+ f)
outerF,Vector (FaceId' s, SimplePolygon v r :+ f)
innerFs) = FaceId' s
-> PlaneGraph s v e f r
-> ((FaceId' s, MultiPolygon (Maybe v) r :+ f),
    Vector (FaceId' s, SimplePolygon v r :+ f))
forall k r (s :: k) v e f.
(Num r, Ord r) =>
FaceId' s
-> PlaneGraph s v e f r
-> ((FaceId' s, MultiPolygon (Maybe v) r :+ f),
    Vector (FaceId' s, SimplePolygon v r :+ f))
facePolygons FaceId' s
i PlaneGraph s v e f r
g
    vs :: [IpeObject r]
vs  = ((VertexId' s, VertexData r v) -> Maybe (IpeObject r))
-> [(VertexId' s, VertexData r v)] -> [IpeObject r]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (((vi r :+ Attributes' r (AttributesOf vi)) -> IpeObject r)
-> Maybe (vi r :+ Attributes' r (AttributesOf vi))
-> Maybe (IpeObject r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (vi r :+ Attributes' r (AttributesOf vi)) -> IpeObject r
forall (i :: * -> *) r. ToObject i => IpeObject' i r -> IpeObject r
iO (Maybe (vi r :+ Attributes' r (AttributesOf vi))
 -> Maybe (IpeObject r))
-> IpeOut' Maybe (VertexId' s, VertexData r v) vi r
-> (VertexId' s, VertexData r v)
-> Maybe (IpeObject r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IpeOut' Maybe (VertexId' s, VertexData r v) vi r
fv)  ([(VertexId' s, VertexData r v)] -> [IpeObject r])
-> (PlaneGraph s v e f r -> [(VertexId' s, VertexData r v)])
-> PlaneGraph s v e f r
-> [IpeObject r]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector (VertexId' s, VertexData r v)
-> [(VertexId' s, VertexData r v)]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList (Vector (VertexId' s, VertexData r v)
 -> [(VertexId' s, VertexData r v)])
-> (PlaneGraph s v e f r -> Vector (VertexId' s, VertexData r v))
-> PlaneGraph s v e f r
-> [(VertexId' s, VertexData r v)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PlaneGraph s v e f r -> Vector (VertexId' s, VertexData r v)
forall k (s :: k) v e f r.
PlaneGraph s v e f r -> Vector (VertexId' s, VertexData r v)
vertices        (PlaneGraph s v e f r -> [IpeObject r])
-> PlaneGraph s v e f r -> [IpeObject r]
forall a b. (a -> b) -> a -> b
$ PlaneGraph s v e f r
g
    es :: [IpeObject r]
es  = ((Dart s, LineSegment 2 v r :+ e) -> Maybe (IpeObject r))
-> [(Dart s, LineSegment 2 v r :+ e)] -> [IpeObject r]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (((ei r :+ Attributes' r (AttributesOf ei)) -> IpeObject r)
-> Maybe (ei r :+ Attributes' r (AttributesOf ei))
-> Maybe (IpeObject r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ei r :+ Attributes' r (AttributesOf ei)) -> IpeObject r
forall (i :: * -> *) r. ToObject i => IpeObject' i r -> IpeObject r
iO (Maybe (ei r :+ Attributes' r (AttributesOf ei))
 -> Maybe (IpeObject r))
-> IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
-> (Dart s, LineSegment 2 v r :+ e)
-> Maybe (IpeObject r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IpeOut' Maybe (Dart s, LineSegment 2 v r :+ e) ei r
fe)  ([(Dart s, LineSegment 2 v r :+ e)] -> [IpeObject r])
-> (PlaneGraph s v e f r -> [(Dart s, LineSegment 2 v r :+ e)])
-> PlaneGraph s v e f r
-> [IpeObject r]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector (Dart s, LineSegment 2 v r :+ e)
-> [(Dart s, LineSegment 2 v r :+ e)]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList (Vector (Dart s, LineSegment 2 v r :+ e)
 -> [(Dart s, LineSegment 2 v r :+ e)])
-> (PlaneGraph s v e f r
    -> Vector (Dart s, LineSegment 2 v r :+ e))
-> PlaneGraph s v e f r
-> [(Dart s, LineSegment 2 v r :+ e)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PlaneGraph s v e f r -> Vector (Dart s, LineSegment 2 v r :+ e)
forall k (s :: k) v e f r.
PlaneGraph s v e f r -> Vector (Dart s, LineSegment 2 v r :+ e)
edgeSegments    (PlaneGraph s v e f r -> [IpeObject r])
-> PlaneGraph s v e f r -> [IpeObject r]
forall a b. (a -> b) -> a -> b
$ PlaneGraph s v e f r
g
    ifs :: [IpeObject r]
ifs = ((FaceId' s, SimplePolygon v r :+ f) -> Maybe (IpeObject r))
-> [(FaceId' s, SimplePolygon v r :+ f)] -> [IpeObject r]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (((fi r :+ Attributes' r (AttributesOf fi)) -> IpeObject r)
-> Maybe (fi r :+ Attributes' r (AttributesOf fi))
-> Maybe (IpeObject r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (fi r :+ Attributes' r (AttributesOf fi)) -> IpeObject r
forall (i :: * -> *) r. ToObject i => IpeObject' i r -> IpeObject r
iO (Maybe (fi r :+ Attributes' r (AttributesOf fi))
 -> Maybe (IpeObject r))
-> IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
-> (FaceId' s, SimplePolygon v r :+ f)
-> Maybe (IpeObject r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IpeOut' Maybe (FaceId' s, SimplePolygon v r :+ f) fi r
fif) ([(FaceId' s, SimplePolygon v r :+ f)] -> [IpeObject r])
-> (Vector (FaceId' s, SimplePolygon v r :+ f)
    -> [(FaceId' s, SimplePolygon v r :+ f)])
-> Vector (FaceId' s, SimplePolygon v r :+ f)
-> [IpeObject r]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector (FaceId' s, SimplePolygon v r :+ f)
-> [(FaceId' s, SimplePolygon v r :+ f)]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList (Vector (FaceId' s, SimplePolygon v r :+ f) -> [IpeObject r])
-> Vector (FaceId' s, SimplePolygon v r :+ f) -> [IpeObject r]
forall a b. (a -> b) -> a -> b
$ Vector (FaceId' s, SimplePolygon v r :+ f)
innerFs
    of' :: [IpeObject r]
of' = ((FaceId' s, MultiPolygon (Maybe v) r :+ f) -> Maybe (IpeObject r))
-> [(FaceId' s, MultiPolygon (Maybe v) r :+ f)] -> [IpeObject r]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (((fi r :+ Attributes' r (AttributesOf fi)) -> IpeObject r)
-> Maybe (fi r :+ Attributes' r (AttributesOf fi))
-> Maybe (IpeObject r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (fi r :+ Attributes' r (AttributesOf fi)) -> IpeObject r
forall (i :: * -> *) r. ToObject i => IpeObject' i r -> IpeObject r
iO (Maybe (fi r :+ Attributes' r (AttributesOf fi))
 -> Maybe (IpeObject r))
-> IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
-> (FaceId' s, MultiPolygon (Maybe v) r :+ f)
-> Maybe (IpeObject r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IpeOut' Maybe (FaceId' s, MultiPolygon (Maybe v) r :+ f) fi r
fof) [(FaceId' s, MultiPolygon (Maybe v) r :+ f)
outerF]