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)
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 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)]
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
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
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
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
(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
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
([Drawing lbl leaf], [Drawing lbl leaf])
_ -> Drawing lbl leaf
drawing
Drawing lbl leaf
_ -> Drawing lbl leaf
drawing