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 ind (StaticMap idx els) = lookup' 1
    where
      lookup' n = if n > snd (bounds idx)
                  then Nothing
                  else case compare ind (idx!n) of
                         LT -> lookup' (n * 2)
                         GT -> lookup' ((n * 2) + 1)
                         EQ -> Just $ els!n

member :: (StaticElement i,StaticElement e,Ord i) => i -> StaticMap i e -> Bool
member ind (StaticMap idx _) = lookup' 1
    where
      lookup' n = if n > snd (bounds idx)
                  then False
                  else case compare ind (idx!n) of
                         LT -> lookup' (n * 2)
                         GT -> lookup' ((n * 2) + 1)
                         EQ -> True