module AlignP where
--import Alignment(Alignment(..))
--import Geometry(Line(..), Point(..), Rect(..), Size(..), padd, psub, rR)
--import LayoutDir(LayoutDir)
import LayoutRequest
import Utils(mapPair, number, swap)
import HbcUtils(apSnd)
import List2(sort)
--import Spacers

-- placer operations

idP :: Placer
idP :: Placer
idP = Placer1 -> Placer
P forall a b. (a -> b) -> a -> b
$ \ [LayoutRequest
req] -> (LayoutRequest
req, (forall a. a -> [a] -> [a]
: []))

--revP :: Placer -> Placer
revP :: Placer -> Placer
revP = (Placer1 -> Placer1) -> Placer -> Placer
mapP forall {a} {a} {a} {a}.
([a] -> (a, a -> [a])) -> [a] -> (a, a -> [a])
revP'
  where revP' :: ([a] -> (a, a -> [a])) -> [a] -> (a, a -> [a])
revP' [a] -> (a, a -> [a])
placer = forall {t} {b} {a}. (t -> b) -> (a, t) -> (a, b)
apSnd (forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> (a, a -> [a])
placer forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse

mapP :: (Placer1 -> Placer1) -> Placer -> Placer
mapP Placer1 -> Placer1
f (P Placer1
p) = Placer1 -> Placer
P (Placer1 -> Placer1
f Placer1
p)

flipP :: Placer -> Placer
flipP :: Placer -> Placer
flipP = (Placer1 -> Placer1) -> Placer -> Placer
mapP Placer1 -> Placer1
flipP'
  where
    flipP' :: Placer1 -> Placer1
flipP' Placer1
placer = forall {t1} {a} {t2} {b}. (t1 -> a, t2 -> b) -> (t1, t2) -> (a, b)
mapPair (LayoutRequest -> LayoutRequest
flipReq,(Rect -> [Rect]) -> Rect -> [Rect]
flipP2) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Placer1
placer forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map LayoutRequest -> LayoutRequest
flipReq
    flipP2 :: (Rect -> [Rect]) -> Rect -> [Rect]
flipP2 Rect -> [Rect]
p2 = forall a b. (a -> b) -> [a] -> [b]
map Rect -> Rect
flipRectforall b c a. (b -> c) -> (a -> b) -> a -> c
.Rect -> [Rect]
p2forall b c a. (b -> c) -> (a -> b) -> a -> c
.Rect -> Rect
flipRect

permuteP :: [Int] -> Placer -> Placer
permuteP :: [Int] -> Placer -> Placer
permuteP [Int]
perm = (Placer1 -> Placer1) -> Placer -> Placer
mapP forall {a} {a} {a} {a}.
([a] -> (a, a -> [a])) -> [a] -> (a, a -> [a])
permuteP'
  where
    permuteP' :: ([b] -> (a, a -> [b])) -> [b] -> (a, a -> [b])
permuteP' [b] -> (a, a -> [b])
placer = forall {t} {b} {a}. (t -> b) -> (a, t) -> (a, b)
apSnd (forall a. [a] -> [a]
rpermf forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [b] -> (a, a -> [b])
placer forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
fpermf
    rperm :: [Int]
rperm = (forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ord a => [a] -> [a]
sort forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall {b} {a}. (b, a) -> (a, b)
swap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> [a] -> [(Int, a)]
number Int
0) [Int]
perm
    fpermf :: [b] -> [b]
fpermf = forall {b}. [Int] -> [b] -> [b]
permf [Int]
perm
    rpermf :: [b] -> [b]
rpermf = forall {b}. [Int] -> [b] -> [b]
permf [Int]
rperm
    permf :: [Int] -> [b] -> [b]
permf [Int]
perm [b]
xs = forall a b. (a -> b) -> [a] -> [b]
map ([b]
xsforall a. [a] -> Int -> a
!!) [Int]
perm