module DrawingOps where
import Drawing(Drawing(..),DPath(..),up)
import Utils(number)

drawingPart :: Drawing lbl leaf -> DPath -> Drawing lbl leaf
drawingPart Drawing lbl leaf
drawing DPath
path =
  case Drawing lbl leaf -> DPath -> Maybe (Drawing lbl leaf)
forall lbl leaf.
Drawing lbl leaf -> DPath -> Maybe (Drawing lbl leaf)
maybeDrawingPart Drawing lbl leaf
drawing DPath
path of
    Just Drawing lbl leaf
part -> Drawing lbl leaf
part
    Maybe (Drawing lbl leaf)
Nothing -> [Char] -> Drawing lbl leaf
forall a. HasCallStack => [Char] -> a
error ([Char]
"bad path in drawingPart "[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++DPath -> [Char]
forall a. Show a => a -> [Char]
show DPath
path)

maybeDrawingPart :: Drawing lbl leaf -> DPath -> Maybe (Drawing lbl leaf)
maybeDrawingPart Drawing lbl leaf
drawing DPath
path =
  case (DPath
path::DPath) of
    [] -> Drawing lbl leaf -> Maybe (Drawing lbl leaf)
forall a. a -> Maybe a
Just Drawing lbl leaf
drawing
    Int
p:DPath
ps -> Drawing lbl leaf -> Maybe (Drawing lbl leaf)
part Drawing lbl leaf
drawing
      where
        part0 :: Drawing lbl leaf -> Maybe (Drawing lbl leaf)
part0 Drawing lbl leaf
d = if Int
pInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
0
	          then Drawing lbl leaf -> DPath -> Maybe (Drawing lbl leaf)
maybeDrawingPart Drawing lbl leaf
d DPath
ps
		  else Maybe (Drawing lbl leaf)
forall a. Maybe a
Nothing
        part :: Drawing lbl leaf -> Maybe (Drawing lbl leaf)
part Drawing lbl leaf
drawing =
	  case Drawing lbl leaf
drawing of
	    AtomicD           leaf
_  -> Maybe (Drawing lbl leaf)
forall a. Maybe a
Nothing
	    LabelD    lbl
_       Drawing lbl leaf
d  -> Drawing lbl leaf -> Maybe (Drawing lbl leaf)
part0 Drawing lbl leaf
d
	    AttribD   GCSpec
gcattrs Drawing lbl leaf
d  -> Drawing lbl leaf -> Maybe (Drawing lbl leaf)
part0 Drawing lbl leaf
d
	    SpacedD   Spacer
spacer  Drawing lbl leaf
d  -> Drawing lbl leaf -> Maybe (Drawing lbl leaf)
part0 Drawing lbl leaf
d
	    PlacedD   Placer
placer  Drawing lbl leaf
d  -> Drawing lbl leaf -> Maybe (Drawing lbl leaf)
part0 Drawing lbl leaf
d
	    ComposedD Int
_       [Drawing lbl leaf]
ds ->
	      if Int
1Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
p Bool -> Bool -> Bool
&& Int
pInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=[Drawing lbl leaf] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Drawing lbl leaf]
ds
	      then Drawing lbl leaf -> DPath -> Maybe (Drawing lbl leaf)
maybeDrawingPart ([Drawing lbl leaf]
ds [Drawing lbl leaf] -> Int -> Drawing lbl leaf
forall a. [a] -> Int -> a
!! (Int
pInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)) DPath
ps
	      else Maybe (Drawing lbl leaf)
forall a. Maybe a
Nothing

drawingAnnotPart :: Drawing b leaf -> DPath -> DPath
drawingAnnotPart = (b -> Bool) -> Drawing b leaf -> DPath -> DPath
forall t leaf. (t -> Bool) -> Drawing t leaf -> DPath -> DPath
drawingAnnotPart' (Bool -> b -> Bool
forall a b. a -> b -> a
const Bool
True)

drawingAnnotPart' :: (t -> Bool) -> Drawing t leaf -> DPath -> DPath
drawingAnnotPart' t -> Bool
p Drawing t leaf
drawing DPath
path =
      case DPath
path of
        [] -> []
	DPath
_ -> case Drawing t leaf -> DPath -> Maybe (Drawing t leaf)
forall lbl leaf.
Drawing lbl leaf -> DPath -> Maybe (Drawing lbl leaf)
maybeDrawingPart Drawing t leaf
drawing DPath
path of
	       Just (LabelD t
a Drawing t leaf
_) | t -> Bool
p t
a -> DPath
path
	       Maybe (Drawing t leaf)
_ -> (t -> Bool) -> Drawing t leaf -> DPath -> DPath
drawingAnnotPart' t -> Bool
p Drawing t leaf
drawing (DPath -> DPath
up DPath
path)

isVisibleDrawingPart :: Drawing lbl leaf -> DPath -> Bool
isVisibleDrawingPart Drawing lbl leaf
drawing DPath
path =
  case (DPath
path::DPath) of
    [] -> Bool
True
    Int
p:DPath
ps -> Drawing lbl leaf -> Bool
visible Drawing lbl leaf
drawing
      where
        visible0 :: Drawing lbl leaf -> Bool
visible0 Drawing lbl leaf
d = Int
pInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
0 Bool -> Bool -> Bool
&& Drawing lbl leaf -> DPath -> Bool
isVisibleDrawingPart Drawing lbl leaf
d DPath
ps -- ??
        visible :: Drawing lbl leaf -> Bool
visible Drawing lbl leaf
drawing =
	  case Drawing lbl leaf
drawing of
	    AtomicD           leaf
_  -> Bool
True -- ??
	    LabelD    lbl
_       Drawing lbl leaf
d  -> Drawing lbl leaf -> Bool
visible0 Drawing lbl leaf
d
	    AttribD   GCSpec
gcattrs Drawing lbl leaf
d  -> Drawing lbl leaf -> Bool
visible0 Drawing lbl leaf
d
	    SpacedD   Spacer
spacer  Drawing lbl leaf
d  -> Drawing lbl leaf -> Bool
visible0 Drawing lbl leaf
d
	    PlacedD   Placer
placer  Drawing lbl leaf
d  -> Drawing lbl leaf -> Bool
visible0 Drawing lbl leaf
d
	    ComposedD Int
n       [Drawing lbl leaf]
ds ->
	      Int
1Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
p Bool -> Bool -> Bool
&& Int
pInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
n Bool -> Bool -> Bool
&& Drawing lbl leaf -> DPath -> Bool
isVisibleDrawingPart ([Drawing lbl leaf]
ds [Drawing lbl leaf] -> Int -> Drawing lbl leaf
forall a. [a] -> Int -> a
!! (Int
pInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)) DPath
ps

visibleAncestor :: Drawing lbl leaf -> DPath -> DPath
visibleAncestor Drawing lbl leaf
drawing DPath
path =
  case DPath
path::DPath of
    [] -> DPath
path
    Int
p:DPath
ps ->
      case Drawing lbl leaf
drawing of
        AtomicD           leaf
_  -> DPath
path
	LabelD    lbl
_       Drawing lbl leaf
d  -> Drawing lbl leaf -> DPath
skip Drawing lbl leaf
d
	AttribD   GCSpec
gcattrs Drawing lbl leaf
d  -> Drawing lbl leaf -> DPath
skip Drawing lbl leaf
d
	SpacedD   Spacer
spacer  Drawing lbl leaf
d  -> Drawing lbl leaf -> DPath
skip Drawing lbl leaf
d
	PlacedD   Placer
placer  Drawing lbl leaf
d  -> Drawing lbl leaf -> DPath
skip Drawing lbl leaf
d
	ComposedD Int
n       [Drawing lbl leaf]
ds ->
	  if Int
1Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
p Bool -> Bool -> Bool
&& Int
pInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
n
	  then Int
pInt -> DPath -> DPath
forall a. a -> [a] -> [a]
:Drawing lbl leaf -> DPath -> DPath
visibleAncestor ([Drawing lbl leaf]
ds[Drawing lbl leaf] -> Int -> Drawing lbl leaf
forall a. [a] -> Int -> a
!!(Int
pInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)) DPath
ps
	  else []
      where skip :: Drawing lbl leaf -> DPath
skip Drawing lbl leaf
d = Int
0Int -> DPath -> DPath
forall a. a -> [a] -> [a]
:Drawing lbl leaf -> DPath -> DPath
visibleAncestor Drawing lbl leaf
d DPath
ps

replacePart :: Drawing lbl leaf -> DPath -> Drawing lbl leaf -> Drawing lbl leaf
replacePart Drawing lbl leaf
drawing DPath
path Drawing lbl leaf
new = Drawing lbl leaf
-> DPath
-> (Drawing lbl leaf -> Drawing lbl leaf)
-> Drawing lbl leaf
forall lbl leaf.
Drawing lbl leaf
-> DPath
-> (Drawing lbl leaf -> Drawing lbl leaf)
-> Drawing lbl leaf
updatePart Drawing lbl leaf
drawing DPath
path (Drawing lbl leaf -> Drawing lbl leaf -> Drawing lbl leaf
forall a b. a -> b -> a
const Drawing lbl leaf
new)

updatePart :: Drawing lbl leaf
-> DPath
-> (Drawing lbl leaf -> Drawing lbl leaf)
-> Drawing lbl leaf
updatePart Drawing lbl leaf
drawing DPath
path Drawing lbl leaf -> Drawing lbl leaf
new =
  case (DPath
path::DPath) of
    [] -> Drawing lbl leaf -> Drawing lbl leaf
new Drawing lbl leaf
drawing
    Int
p:DPath
ps  -> Drawing lbl leaf -> Drawing lbl leaf
repl Drawing lbl leaf
drawing
      where
        err :: a
err = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"bad path in updatePart"
        repl0 :: Drawing lbl leaf -> Drawing lbl leaf
repl0 Drawing lbl leaf
d = if Int
pInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
0 then Drawing lbl leaf
-> DPath
-> (Drawing lbl leaf -> Drawing lbl leaf)
-> Drawing lbl leaf
updatePart Drawing lbl leaf
d DPath
ps Drawing lbl leaf -> Drawing lbl leaf
new else Drawing lbl leaf
forall a. a
err
        repl :: Drawing lbl leaf -> Drawing lbl leaf
repl Drawing lbl leaf
drawing =
	  case Drawing lbl leaf
drawing of
	    AtomicD           leaf
_  -> Drawing lbl leaf
forall a. a
err
	    AttribD   GCSpec
gcattrs Drawing lbl leaf
d  -> GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
AttribD GCSpec
gcattrs (Drawing lbl leaf -> Drawing lbl leaf
repl0 Drawing lbl leaf
d)
	    LabelD    lbl
label   Drawing lbl leaf
d  -> lbl -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. lbl -> Drawing lbl leaf -> Drawing lbl leaf
LabelD lbl
label (Drawing lbl leaf -> Drawing lbl leaf
repl0 Drawing lbl leaf
d)
	    SpacedD   Spacer
spacer  Drawing lbl leaf
d  -> Spacer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
SpacedD Spacer
spacer (Drawing lbl leaf -> Drawing lbl leaf
repl0 Drawing lbl leaf
d)
	    PlacedD   Placer
placer  Drawing lbl leaf
d  -> Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
placer (Drawing lbl leaf -> Drawing lbl leaf
repl0 Drawing lbl leaf
d)
	    ComposedD Int
n       [Drawing lbl leaf]
ds ->
	      let ([Drawing lbl leaf]
pre,Drawing lbl leaf
d:[Drawing lbl leaf]
post) = Int
-> [Drawing lbl leaf] -> ([Drawing lbl leaf], [Drawing lbl leaf])
forall a. Int -> [a] -> ([a], [a])
splitAt (Int
pInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [Drawing lbl leaf]
ds
              in Int -> [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD Int
n ([Drawing lbl leaf]
pre[Drawing lbl leaf] -> [Drawing lbl leaf] -> [Drawing lbl leaf]
forall a. [a] -> [a] -> [a]
++Drawing lbl leaf
-> DPath
-> (Drawing lbl leaf -> Drawing lbl leaf)
-> Drawing lbl leaf
updatePart Drawing lbl leaf
d DPath
ps Drawing lbl leaf -> Drawing lbl leaf
newDrawing lbl leaf -> [Drawing lbl leaf] -> [Drawing lbl leaf]
forall a. a -> [a] -> [a]
:[Drawing lbl leaf]
post)

mapLabelDrawing :: (t -> lbl) -> Drawing t leaf -> Drawing lbl leaf
mapLabelDrawing t -> lbl
f = Drawing t leaf -> Drawing lbl leaf
forall leaf. Drawing t leaf -> Drawing lbl leaf
ma
  where
    ma :: Drawing t leaf -> Drawing lbl leaf
ma Drawing t leaf
d =
      case Drawing t leaf
d of
	AtomicD           leaf
x  -> leaf -> Drawing lbl leaf
forall lbl leaf. leaf -> Drawing lbl leaf
AtomicD leaf
x
	AttribD   GCSpec
gcattrs Drawing t leaf
d  -> GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
AttribD GCSpec
gcattrs (Drawing t leaf -> Drawing lbl leaf
ma Drawing t leaf
d)
	LabelD    t
label   Drawing t leaf
d  -> lbl -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. lbl -> Drawing lbl leaf -> Drawing lbl leaf
LabelD (t -> lbl
f t
label) (Drawing t leaf -> Drawing lbl leaf
ma Drawing t leaf
d)
	SpacedD   Spacer
spacer  Drawing t leaf
d  -> Spacer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
SpacedD Spacer
spacer (Drawing t leaf -> Drawing lbl leaf
ma Drawing t leaf
d)
	PlacedD   Placer
placer  Drawing t leaf
d  -> Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
placer (Drawing t leaf -> Drawing lbl leaf
ma Drawing t leaf
d)
	ComposedD Int
n       [Drawing t leaf]
ds -> Int -> [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD Int
n ((Drawing t leaf -> Drawing lbl leaf)
-> [Drawing t leaf] -> [Drawing lbl leaf]
forall a b. (a -> b) -> [a] -> [b]
map Drawing t leaf -> Drawing lbl leaf
ma [Drawing t leaf]
ds)

mapLeafDrawing :: (t -> leaf) -> Drawing lbl t -> Drawing lbl leaf
mapLeafDrawing t -> leaf
f = Drawing lbl t -> Drawing lbl leaf
forall lbl. Drawing lbl t -> Drawing lbl leaf
ma
  where
    ma :: Drawing lbl t -> Drawing lbl leaf
ma Drawing lbl t
d =
      case Drawing lbl t
d of
	AtomicD           t
x  -> leaf -> Drawing lbl leaf
forall lbl leaf. leaf -> Drawing lbl leaf
AtomicD (t -> leaf
f t
x)
	AttribD   GCSpec
gcattrs Drawing lbl t
d  -> GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
AttribD GCSpec
gcattrs (Drawing lbl t -> Drawing lbl leaf
ma Drawing lbl t
d)
	LabelD    lbl
label   Drawing lbl t
d  -> lbl -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. lbl -> Drawing lbl leaf -> Drawing lbl leaf
LabelD lbl
label (Drawing lbl t -> Drawing lbl leaf
ma Drawing lbl t
d)
	SpacedD   Spacer
spacer  Drawing lbl t
d  -> Spacer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
SpacedD Spacer
spacer (Drawing lbl t -> Drawing lbl leaf
ma Drawing lbl t
d)
	PlacedD   Placer
placer  Drawing lbl t
d  -> Placer -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
placer (Drawing lbl t -> Drawing lbl leaf
ma Drawing lbl t
d)
	ComposedD Int
n       [Drawing lbl t]
ds -> Int -> [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD Int
n ((Drawing lbl t -> Drawing lbl leaf)
-> [Drawing lbl t] -> [Drawing lbl leaf]
forall a b. (a -> b) -> [a] -> [b]
map Drawing lbl t -> Drawing lbl leaf
ma [Drawing lbl t]
ds)

{-
drawingArity drawing =
  case drawing of
    AtomicD     _  -> 0
    LabelD    _ d  -> drawingArity d
    AttribD   _ d  -> drawingArity d
    SpacedD   _ d  -> drawingArity d
    PlacedD   _ d  -> drawingArity d
    ComposedD _ ds -> length ds
-}

annotChildren :: Drawing b d -> [(DPath, Drawing b d)]
annotChildren = (b -> Bool) -> Drawing b d -> [(DPath, Drawing b d)]
forall a d. (a -> Bool) -> Drawing a d -> [(DPath, Drawing a d)]
annotChildren' (Bool -> b -> Bool
forall a b. a -> b -> a
const Bool
True)

annotChildren' :: (a -> Bool) -> (Drawing a d) -> [(DPath, Drawing a d)]   
annotChildren' :: (a -> Bool) -> Drawing a d -> [(DPath, Drawing a d)]
annotChildren' a -> Bool
p Drawing a d
drawing =
    case Drawing a d
drawing of
      LabelD a
_ Drawing a d
d -> Drawing a d -> [(DPath, Drawing a d)]
forall leaf. Drawing a leaf -> [(DPath, Drawing a leaf)]
ac0 Drawing a d
d
      Drawing a d
d -> Drawing a d -> [(DPath, Drawing a d)]
forall leaf. Drawing a leaf -> [(DPath, Drawing a leaf)]
ac Drawing a d
d
  where 
    ac0 :: Drawing a leaf -> [(DPath, Drawing a leaf)]
ac0 Drawing a leaf
d0 = [(Int
0Int -> DPath -> DPath
forall a. a -> [a] -> [a]
:DPath
p,Drawing a leaf
d)| (DPath
p,Drawing a leaf
d)<-Drawing a leaf -> [(DPath, Drawing a leaf)]
ac Drawing a leaf
d0]
    ac :: Drawing a leaf -> [(DPath, Drawing a leaf)]
ac Drawing a leaf
d =
      case Drawing a leaf
d of
        AtomicD     leaf
_  -> []
        LabelD    a
a Drawing a leaf
d' -> if a -> Bool
p a
a then [([],Drawing a leaf
d)] else Drawing a leaf -> [(DPath, Drawing a leaf)]
ac0 Drawing a leaf
d'
	AttribD   GCSpec
_ Drawing a leaf
d  -> Drawing a leaf -> [(DPath, Drawing a leaf)]
ac0 Drawing a leaf
d
	SpacedD   Spacer
_ Drawing a leaf
d  -> Drawing a leaf -> [(DPath, Drawing a leaf)]
ac0 Drawing a leaf
d
	PlacedD   Placer
_ Drawing a leaf
d  -> Drawing a leaf -> [(DPath, Drawing a leaf)]
ac0 Drawing a leaf
d
	ComposedD Int
_ [Drawing a leaf]
ds -> [(Int
iInt -> DPath -> DPath
forall a. a -> [a] -> [a]
:DPath
p,Drawing a leaf
d) | (Int
i,[(DPath, Drawing a leaf)]
cs) <- Int
-> [[(DPath, Drawing a leaf)]]
-> [(Int, [(DPath, Drawing a leaf)])]
forall a. Int -> [a] -> [(Int, a)]
number Int
1 ((Drawing a leaf -> [(DPath, Drawing a leaf)])
-> [Drawing a leaf] -> [[(DPath, Drawing a leaf)]]
forall a b. (a -> b) -> [a] -> [b]
map Drawing a leaf -> [(DPath, Drawing a leaf)]
ac [Drawing a leaf]
ds), (DPath
p,Drawing a leaf
d)<-[(DPath, Drawing a leaf)]
cs]

{-
drawingAnnots :: Drawing a d -> [(DPath,a)]   
drawingAnnots drawing = da drawing
  where 
    da d =
      case d of
        AtomicD     _  -> []
        LabelD    a d' -> ([],a):da d'
	AttribD   _ d  -> da d
	SpacedD   _ d  -> da d
	PlacedD   _ d  -> da d
	ComposedD _ ds -> [(i:p,d) | (i,cs) <- number 1 (map da ds), (p,d)<-cs]
-}

drawingAnnots :: Drawing a leaf -> [(DPath, a)]
drawingAnnots Drawing a leaf
drawing = Drawing a leaf -> (Drawing a leaf -> Maybe a) -> [(DPath, a)]
forall lbl leaf a.
Drawing lbl leaf -> (Drawing lbl leaf -> Maybe a) -> [(DPath, a)]
extractParts Drawing a leaf
drawing Drawing a leaf -> Maybe a
forall a leaf. Drawing a leaf -> Maybe a
sel
  where sel :: Drawing a leaf -> Maybe a
sel (LabelD a
a Drawing a leaf
d) = a -> Maybe a
forall a. a -> Maybe a
Just a
a
	sel Drawing a leaf
_ = Maybe a
forall a. Maybe a
Nothing

extractParts :: Drawing lbl leaf -> (Drawing lbl leaf -> Maybe a) -> [(DPath,a)]
extractParts :: Drawing lbl leaf -> (Drawing lbl leaf -> Maybe a) -> [(DPath, a)]
extractParts Drawing lbl leaf
drawing Drawing lbl leaf -> Maybe a
sel = Drawing lbl leaf -> [(DPath, a)]
extr Drawing lbl leaf
drawing
  where
    extr0 :: Drawing lbl leaf -> [(DPath, a)]
extr0 Drawing lbl leaf
d = [(Int
0Int -> DPath -> DPath
forall a. a -> [a] -> [a]
:DPath
p,a
d') | (DPath
p,a
d') <- Drawing lbl leaf -> [(DPath, a)]
extr Drawing lbl leaf
d]
    extr :: Drawing lbl leaf -> [(DPath, a)]
extr Drawing lbl leaf
d =
      (case Drawing lbl leaf -> Maybe a
sel Drawing lbl leaf
d of
	 Just a
x -> (([],a
x)(DPath, a) -> [(DPath, a)] -> [(DPath, a)]
forall a. a -> [a] -> [a]
:)
	 Maybe a
_ -> [(DPath, a)] -> [(DPath, a)]
forall a. a -> a
id) ([(DPath, a)] -> [(DPath, a)]) -> [(DPath, a)] -> [(DPath, a)]
forall a b. (a -> b) -> a -> b
$
      case Drawing lbl leaf
d of
        AtomicD     leaf
_  -> []
        LabelD    lbl
a Drawing lbl leaf
d' -> Drawing lbl leaf -> [(DPath, a)]
extr0 Drawing lbl leaf
d'
	AttribD   GCSpec
_ Drawing lbl leaf
d  -> Drawing lbl leaf -> [(DPath, a)]
extr0 Drawing lbl leaf
d
	SpacedD   Spacer
_ Drawing lbl leaf
d  -> Drawing lbl leaf -> [(DPath, a)]
extr0 Drawing lbl leaf
d
	PlacedD   Placer
_ Drawing lbl leaf
d  -> Drawing lbl leaf -> [(DPath, a)]
extr0 Drawing lbl leaf
d
	ComposedD Int
_ [Drawing lbl leaf]
ds -> [(Int
iInt -> DPath -> DPath
forall a. a -> [a] -> [a]
:DPath
p,a
d) | (Int
i,[(DPath, a)]
cs) <- Int -> [[(DPath, a)]] -> [(Int, [(DPath, a)])]
forall a. Int -> [a] -> [(Int, a)]
number Int
1 ((Drawing lbl leaf -> [(DPath, a)])
-> [Drawing lbl leaf] -> [[(DPath, a)]]
forall a b. (a -> b) -> [a] -> [b]
map Drawing lbl leaf -> [(DPath, a)]
extr [Drawing lbl leaf]
ds), (DPath
p,a
d)<-[(DPath, a)]
cs]

deletePart :: Drawing lbl leaf -> DPath -> Drawing lbl leaf
deletePart Drawing lbl leaf
drawing [] = Drawing lbl leaf
drawing -- !! error report?
deletePart Drawing lbl leaf
drawing DPath
path =
    Drawing lbl leaf
-> DPath
-> (Drawing lbl leaf -> Drawing lbl leaf)
-> Drawing lbl leaf
forall lbl leaf.
Drawing lbl leaf
-> DPath
-> (Drawing lbl leaf -> Drawing lbl leaf)
-> Drawing lbl leaf
updatePart Drawing lbl leaf
drawing (DPath -> DPath
forall a. [a] -> [a]
init DPath
path) (Int -> Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Int -> Drawing lbl leaf -> Drawing lbl leaf
deleteElem (DPath -> Int
forall a. [a] -> a
last DPath
path))
  where
    deleteElem :: Int -> Drawing lbl leaf -> Drawing lbl leaf
deleteElem Int
i = Drawing lbl leaf -> Drawing lbl leaf
forall lbl leaf. Drawing lbl leaf -> Drawing lbl leaf
di
      where di :: Drawing lbl leaf -> Drawing lbl leaf
di Drawing lbl leaf
d =
              case Drawing lbl leaf
d of
		ComposedD Int
n       [Drawing lbl leaf]
ds ->
		  case Int
-> [Drawing lbl leaf] -> ([Drawing lbl leaf], [Drawing lbl leaf])
forall a. Int -> [a] -> ([a], [a])
splitAt (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [Drawing lbl leaf]
ds of
		    ([Drawing lbl leaf]
ds1,Drawing lbl leaf
_:[Drawing lbl leaf]
ds2) -> Int -> [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD Int
n' ([Drawing lbl leaf]
ds1[Drawing lbl leaf] -> [Drawing lbl leaf] -> [Drawing lbl leaf]
forall a. [a] -> [a] -> [a]
++[Drawing lbl leaf]
ds2)
		    ([Drawing lbl leaf], [Drawing lbl leaf])
_ -> Drawing lbl leaf
d -- !! error report?
		  where n' :: Int
n' = if Int
iInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
n
		             then Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1
			     else Int
n
		Drawing lbl leaf
_                    -> Drawing lbl leaf
d   -- !! error report?
{-
		AtomicD           x  -> d   -- !! error report?
		AttribD   gcattrs d  -> AttribD gcattrs (di d)
		LabelD    label   d  -> LabelD  label   (di d)
		SpacedD   spacer  d  -> SpacedD spacer  (di d)
		PlacedD   placer  d  -> PlacedD placer  (di d)
-}

groupParts :: Int -> Int -> Drawing lbl leaf -> Drawing lbl leaf
groupParts Int
pos0 Int
len0 Drawing lbl leaf
drawing =
  case Drawing lbl leaf
drawing of
    ComposedD Int
n [Drawing lbl leaf]
ds -> Int -> [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD Int
n1 ([Drawing lbl leaf]
ds1[Drawing lbl leaf] -> [Drawing lbl leaf] -> [Drawing lbl leaf]
forall a. [a] -> [a] -> [a]
++Int -> [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD Int
n2 [Drawing lbl leaf]
ds2Drawing lbl leaf -> [Drawing lbl leaf] -> [Drawing lbl leaf]
forall a. a -> [a] -> [a]
:[Drawing lbl leaf]
ds3)
      where
        ([Drawing lbl leaf]
ds1,[Drawing lbl leaf]
ds2a) = Int
-> [Drawing lbl leaf] -> ([Drawing lbl leaf], [Drawing lbl leaf])
forall a. Int -> [a] -> ([a], [a])
splitAt (Int
pos0Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [Drawing lbl leaf]
ds
        ([Drawing lbl leaf]
ds2,[Drawing lbl leaf]
ds3) = Int
-> [Drawing lbl leaf] -> ([Drawing lbl leaf], [Drawing lbl leaf])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
len0 [Drawing lbl leaf]
ds2a
        pos :: Int
pos = [Drawing lbl leaf] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Drawing lbl leaf]
ds1
        len :: Int
len = [Drawing lbl leaf] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Drawing lbl leaf]
ds2
        -- keep the same parts visible
        (Int
n1,Int
n2) = if Int
nInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
pos then (Int
n,Int
0)
                  else if Int
nInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
posInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
len
                       then (Int
posInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1,Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
pos)
                       else (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
lenInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1,Int
len)

ungroupParts :: Int -> Drawing lbl leaf -> Drawing lbl leaf
ungroupParts Int
pos Drawing lbl leaf
drawing =
  case Drawing lbl leaf
drawing of
    ComposedD Int
n1 [Drawing lbl leaf]
ds ->
      case Int
-> [Drawing lbl leaf] -> ([Drawing lbl leaf], [Drawing lbl leaf])
forall a. Int -> [a] -> ([a], [a])
splitAt (Int
posInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [Drawing lbl leaf]
ds of
        ([Drawing lbl leaf]
ds1,ComposedD Int
n2 [Drawing lbl leaf]
ds2:[Drawing lbl leaf]
ds3) -> Int -> [Drawing lbl leaf] -> Drawing lbl leaf
forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD Int
n ([Drawing lbl leaf]
ds1[Drawing lbl leaf] -> [Drawing lbl leaf] -> [Drawing lbl leaf]
forall a. [a] -> [a] -> [a]
++[Drawing lbl leaf]
ds2[Drawing lbl leaf] -> [Drawing lbl leaf] -> [Drawing lbl leaf]
forall a. [a] -> [a] -> [a]
++[Drawing lbl leaf]
ds3)
          where
            -- Can't preserve visibility when some of ds3 was visible
            -- but some of ds2 was hidden
            n :: Int
n = if Int
n1Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
pos then Int
n1
                else if Int
n1Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
posInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1
                     then Int
posInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
n2
                     else Int
n1Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1Int -> Int -> Int
forall a. Num a => a -> a -> a
+[Drawing lbl leaf] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Drawing lbl leaf]
ds2 -- all of ds2 becomes visible!!
        ([Drawing lbl leaf], [Drawing lbl leaf])
_ -> Drawing lbl leaf
drawing -- hmm!!
    Drawing lbl leaf
_ -> Drawing lbl leaf
drawing -- hmm!!