import Data.SortedMap

(&~) : a -> (a -> b) -> b
(&~) x f = f x

infixl 2 &~

testLookupBetween : List (Maybe (Maybe (Int,Int),Maybe (Int,Int)))
testLookupBetween =
  let maps : List (((Maybe (Int,Int), Maybe (Int,Int))),(Maybe (Int,Int), Maybe (Int,Int)))
      maps =
        [
         (lookupBetween 1 (singleton 0 10),((Just (0,10)), Nothing))
        ,(lookupBetween 1 (singleton 0 10 &~ insert 9 90), (Just (0,10), Just (9,90)))
        ,(lookupBetween 7 (singleton 0 10 &~ insert 5 50 &~ insert 9 90 &~ delete 5), (Just (0,10), Just (9,90)))
        ,(lookupBetween (-1) (singleton 0 10), (Nothing,Just (0,10)))
        ,(lookupBetween (-1) (singleton 0 10 &~ insert 9 90), (Nothing,Just (0,10)))
        ,(lookupBetween (-1) (singleton 0 10 &~ insert 9 90 &~ insert 5 50), (Nothing,Just (0,10)))
        ,(lookupBetween (-1) (singleton 0 10 &~ insert 6 60), (Nothing,Just (0,10)))
        ,(lookupBetween 1 (singleton 0 10 &~ insert 9 90 &~ insert 5 50 &~ insert 3 30 &~ insert 7 70 &~ delete 3 &~ delete 7),
                        (Just (0,10),Just (5,50)))
        ,(lookupBetween 4 (singleton 0 10 &~ insert 9 90 &~ insert 5 50 &~ insert 3 30 &~ insert 7 70 &~ delete 3 &~ delete 7),
                        (Just (0,10),Just (5,50)))
        ,(lookupBetween 6 (singleton 0 10 &~ insert 9 90 &~ insert 5 50 &~ insert 3 30 &~ insert 7 70 &~ delete 3 &~ delete 7),
                        (Just (5,50),Just (9,90)))
        ,(lookupBetween 8 (singleton 0 10 &~ insert 9 90 &~ insert 5 50 &~ insert 3 30 &~ insert 7 70 &~ delete 3 &~ delete 7),
                        (Just (5,50),Just (9,90)))
        ,(lookupBetween 10 (singleton 0 10 &~ insert 9 90 &~ insert 5 50 &~ insert 3 30 &~ insert 7 70 &~ delete 3 &~ delete 7),
                        (Just (9,90), Nothing))
        ,(lookupBetween 100 (singleton 10 100 &~ insert 15 150 &~ insert 40 400 &~ insert 60 600 &~ insert 80 800 &~ insert 90 900),
                        (Just (90,900), Nothing))
        ,(lookupBetween 100 (singleton 10 100 &~ insert 15 150 &~ insert 40 400 &~ insert 60 600 &~ insert 80 800 &~ insert 90 900),
                        (Just (90,900), Nothing))
        ,(lookupBetween 61 (singleton 10 100 &~ insert 15 150 &~ insert 40 400 &~ insert 60 600 &~ insert 80 800 &~ insert 90 900),
                        (Just (60,600), Just (80,800)))
        ]
  in
    map (\(t,ev) => if t == ev then Nothing else Just t) maps

testLeftRight : List (Maybe (Maybe (Int,Int)))
testLeftRight =
  let maps : List (Maybe (Int,Int),Maybe (Int,Int))
      maps =
        [
         (leftMost (singleton 10 100 &~ insert 15 150 &~ insert 40 400 &~ insert 60 600 &~ insert 80 800 &~ insert 90 900), Just (10,100))
        ,(rightMost (singleton 10 100 &~ insert 15 150 &~ insert 40 400 &~ insert 60 600 &~ insert 80 800 &~ insert 90 900), Just (90,900))
        ]
  in
    map (\(t,ev) => if t == ev then Nothing else Just t) maps

main : IO ()
main =
  do
    ignore $ traverse (printLn . show) testLookupBetween
    ignore $ traverse (printLn . show) testLeftRight


