module Data.Array.Comfort.Shape.Set where

import Data.Array.Comfort.Shape.Utility (errorIndexFromOffset)

import qualified Data.Set as Set
import Data.Set (Set)
import Data.Tuple.HT (fst3)


offset :: Ord a => Set a -> a -> Int
offset set ix =
   case Set.splitMember ix set of
      (less, hit, _) ->
         if hit
            then Set.size less
            else error "Shape.Set: array index not member of the index set"

uncheckedOffset :: Ord a => Set a -> a -> Int
uncheckedOffset set = Set.size . fst3 . flip Set.splitMember set

indexFromOffset :: Set a -> Int -> a
indexFromOffset set k =
   if 0<=k
      then uncheckedIndexFromOffset set k
      else errorIndexFromOffset "Set" k

uncheckedIndexFromOffset :: Set a -> Int -> a
uncheckedIndexFromOffset set k =
   case drop k $ Set.toAscList set of
      [] -> errorIndexFromOffset "Set" k
      ix:_ -> ix