summaryrefslogtreecommitdiff
path: root/Mask.hs
blob: 0b91e42a5645a5ecd43d6e64766619763d9190e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
module Mask where

import Data.Int

newtype Mask = Mask [(Int32,Int32)]
 deriving (Eq,Ord,Show)

{-
merge ((x0,x):xs) ((y0,y):ys) =
    if x0 <= y0
        then case compare x y0 of
            LT -> (x0 x) (y0 y)
            EQ -> (x0 x=y0 y)
            GT -> if x <= y then -> (x0 y0 x y)
                            else -> (x0 y0 y x)
        else case compare x0 y of
            LT -> if x <= y then (y0 x0 x y)
                            else (y0 x0 y x)
            EQ -> (y0 y=x0 x)
            GT -> (y0 y) (x0 x)
-}

subtr [] ys = []
subtr xs [] = xs
subtr ((x0,x):xs) ((y0,y):ys) =
    if x0 <= y0
        then case compare x y0 of
            LT -> subtr ((x0,x):xs) ys
            EQ -> (x0,x) : subtr xs ((y0,y):ys)
            GT -> if x <= y then (if x0<y0 then ((x0,y0) :) else id) $ subtr xs ((y0,y):ys)
                            else (if x0<y0 then ((x0,y0) :) else id) $ subtr ((y,x):xs) ys
        else case compare x0 y of
            LT -> if x <= y then subtr xs ((y0,y):ys)
                            else subtr ((y,x):xs) ys
            EQ -> subtr ((x0,x):xs) ys
            GT -> subtr ((x0,x):xs) ys

union [] ys = ys
union xs [] = xs
union ((x0,x):xs) ((y0,y):ys) =
    if x0 <= y0
        then case compare x y0 of
            LT -> (x0,x) : union xs ((y0,y):ys)
            EQ -> (x0,y) : union xs ys
            GT -> if x <= y then union xs ((x0,y):ys)
                            else union ((x0,x):xs) ys
        else case compare x0 y of
            LT -> if x <= y then union xs ((y0,y):ys)
                            else union ((y0,x):xs) ys
            EQ -> (y0,x) : union xs ys
            GT -> (y0,y) : union ((x0,x):xs) ys

endpts :: (Int32,Int32) -> (Int32,Int32)
endpts (x0,sz) = (x0,x0 + sz)

sized :: (Int32,Int32) -> (Int32,Int32)
sized (x0,x) = (x0, x - x0)

maskPlus :: Mask -> Mask -> Mask
maskPlus (Mask xs) (Mask ys) = Mask $ sized <$> union (endpts <$> xs) (endpts <$> ys)

maskSubtract :: Mask -> Mask -> Mask
maskSubtract (Mask xs) (Mask ys) = Mask $ sized <$> subtr (endpts <$> xs) (endpts <$> ys)