module Data.Map.Static where

import Data.Static
import Data.Array.Static

import GHC.Exts

data StaticMap i e = StaticMap (StaticArray Int i) (StaticArray Int e)

lookup :: (StaticElement i,StaticElement e,Ord i) => i -> StaticMap i e -> Maybe e
lookup :: forall i e.
(StaticElement i, StaticElement e, Ord i) =>
i -> StaticMap i e -> Maybe e
lookup i
ind (StaticMap StaticArray Int i
idx StaticArray Int e
els) = Int -> Maybe e
lookup' Int
1
    where
      lookup' :: Int -> Maybe e
lookup' Int
n = if Int
n forall a. Ord a => a -> a -> Bool
> forall a b. (a, b) -> b
snd (forall i e. Ix i => StaticArray i e -> (i, i)
bounds StaticArray Int i
idx)
                  then forall a. Maybe a
Nothing
                  else case forall a. Ord a => a -> a -> Ordering
compare i
ind (StaticArray Int i
idxforall e i. (StaticElement e, Ix i) => StaticArray i e -> i -> e
!Int
n) of
                         Ordering
LT -> Int -> Maybe e
lookup' (Int
n forall a. Num a => a -> a -> a
* Int
2)
                         Ordering
GT -> Int -> Maybe e
lookup' ((Int
n forall a. Num a => a -> a -> a
* Int
2) forall a. Num a => a -> a -> a
+ Int
1)
                         Ordering
EQ -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ StaticArray Int e
elsforall e i. (StaticElement e, Ix i) => StaticArray i e -> i -> e
!Int
n

member :: (StaticElement i,StaticElement e,Ord i) => i -> StaticMap i e -> Bool
member :: forall i e.
(StaticElement i, StaticElement e, Ord i) =>
i -> StaticMap i e -> Bool
member i
ind (StaticMap StaticArray Int i
idx StaticArray Int e
_) = Int -> Bool
lookup' Int
1
    where
      lookup' :: Int -> Bool
lookup' Int
n = if Int
n forall a. Ord a => a -> a -> Bool
> forall a b. (a, b) -> b
snd (forall i e. Ix i => StaticArray i e -> (i, i)
bounds StaticArray Int i
idx)
                  then Bool
False
                  else case forall a. Ord a => a -> a -> Ordering
compare i
ind (StaticArray Int i
idxforall e i. (StaticElement e, Ix i) => StaticArray i e -> i -> e
!Int
n) of
                         Ordering
LT -> Int -> Bool
lookup' (Int
n forall a. Num a => a -> a -> a
* Int
2)
                         Ordering
GT -> Int -> Bool
lookup' ((Int
n forall a. Num a => a -> a -> a
* Int
2) forall a. Num a => a -> a -> a
+ Int
1)
                         Ordering
EQ -> Bool
True