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