comfort-array-0.3.1: set/0.4.0/Data/Array/Comfort/Shape/Set.hs
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