dimensions-2.0.0.0: Safe type-level dimensionality for multidimensional data.

Copyright(c) Artem Chirkin
LicenseBSD3
Safe HaskellNone
LanguageHaskell2010

Numeric.Dimensions.Idx

Contents

Description

Provides a data type Idx to index Dim and Idxs that enumerates through multiple dimensions.

Higher indices go first, i.e. assumed enumeration is i = i1*n1*n2*...*n(k-1) + ... + i(k-2)*n1*n2 + i(k-1)*n1 + ik This corresponds to row-first layout of matrices and multidimenional arrays.

Synopsis

Data types

data Idx (n :: k) where Source #

This type is used to index a single dimension; the range of indices is from 0 to n-1.

Bundled Patterns

pattern Idx :: forall (k :: Type) (n :: k). BoundedDim n => Word -> Idx n

Convert between Word and Idx.

If the word is outside of the bounds, fails with an error (unless unsafeindices flag is turned on).

Instances
BoundedDims ds => Bounded (Idxs ds) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

minBound :: Idxs ds #

maxBound :: Idxs ds #

BoundedDim n => Bounded (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

minBound :: Idx n #

maxBound :: Idx n #

Dimensions ds => Enum (Idxs ds) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

succ :: Idxs ds -> Idxs ds #

pred :: Idxs ds -> Idxs ds #

toEnum :: Int -> Idxs ds #

fromEnum :: Idxs ds -> Int #

enumFrom :: Idxs ds -> [Idxs ds] #

enumFromThen :: Idxs ds -> Idxs ds -> [Idxs ds] #

enumFromTo :: Idxs ds -> Idxs ds -> [Idxs ds] #

enumFromThenTo :: Idxs ds -> Idxs ds -> Idxs ds -> [Idxs ds] #

BoundedDim n => Enum (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

succ :: Idx n -> Idx n #

pred :: Idx n -> Idx n #

toEnum :: Int -> Idx n #

fromEnum :: Idx n -> Int #

enumFrom :: Idx n -> [Idx n] #

enumFromThen :: Idx n -> Idx n -> [Idx n] #

enumFromTo :: Idx n -> Idx n -> [Idx n] #

enumFromThenTo :: Idx n -> Idx n -> Idx n -> [Idx n] #

Eq (Idxs xs) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

(==) :: Idxs xs -> Idxs xs -> Bool #

(/=) :: Idxs xs -> Idxs xs -> Bool #

Eq (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

(==) :: Idx n -> Idx n -> Bool #

(/=) :: Idx n -> Idx n -> Bool #

BoundedDim n => Integral (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

quot :: Idx n -> Idx n -> Idx n #

rem :: Idx n -> Idx n -> Idx n #

div :: Idx n -> Idx n -> Idx n #

mod :: Idx n -> Idx n -> Idx n #

quotRem :: Idx n -> Idx n -> (Idx n, Idx n) #

divMod :: Idx n -> Idx n -> (Idx n, Idx n) #

toInteger :: Idx n -> Integer #

(Typeable n, Typeable k) => Data (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Idx n -> c (Idx n) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Idx n) #

toConstr :: Idx n -> Constr #

dataTypeOf :: Idx n -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Idx n)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Idx n)) #

gmapT :: (forall b. Data b => b -> b) -> Idx n -> Idx n #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Idx n -> r #

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Idx n -> r #

gmapQ :: (forall d. Data d => d -> u) -> Idx n -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Idx n -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Idx n -> m (Idx n) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Idx n -> m (Idx n) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Idx n -> m (Idx n) #

BoundedDim n => Num (Idxs (n ': ([] :: [k]))) Source #

With this instance we can slightly reduce indexing expressions, e.g.

x ! (1 :* 2 :* 4) == x ! (1 :* 2 :* 4 :* U)
Instance details

Defined in Numeric.Dimensions.Idx

Methods

(+) :: Idxs (n ': []) -> Idxs (n ': []) -> Idxs (n ': []) #

(-) :: Idxs (n ': []) -> Idxs (n ': []) -> Idxs (n ': []) #

(*) :: Idxs (n ': []) -> Idxs (n ': []) -> Idxs (n ': []) #

negate :: Idxs (n ': []) -> Idxs (n ': []) #

abs :: Idxs (n ': []) -> Idxs (n ': []) #

signum :: Idxs (n ': []) -> Idxs (n ': []) #

fromInteger :: Integer -> Idxs (n ': []) #

BoundedDim n => Num (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

(+) :: Idx n -> Idx n -> Idx n #

(-) :: Idx n -> Idx n -> Idx n #

(*) :: Idx n -> Idx n -> Idx n #

negate :: Idx n -> Idx n #

abs :: Idx n -> Idx n #

signum :: Idx n -> Idx n #

fromInteger :: Integer -> Idx n #

Ord (Idxs xs) Source #

Compare indices by their importance in lexicorgaphic order from the first dimension to the last dimension (the first dimension is the most significant one).

Literally,

compare a b = compare (listIdxs a) (listIdxs b)

This is the same compare rule, as for Dims. This is also consistent with offsets:

sort == sortOn fromEnum
Instance details

Defined in Numeric.Dimensions.Idx

Methods

compare :: Idxs xs -> Idxs xs -> Ordering #

(<) :: Idxs xs -> Idxs xs -> Bool #

(<=) :: Idxs xs -> Idxs xs -> Bool #

(>) :: Idxs xs -> Idxs xs -> Bool #

(>=) :: Idxs xs -> Idxs xs -> Bool #

max :: Idxs xs -> Idxs xs -> Idxs xs #

min :: Idxs xs -> Idxs xs -> Idxs xs #

Ord (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

compare :: Idx n -> Idx n -> Ordering #

(<) :: Idx n -> Idx n -> Bool #

(<=) :: Idx n -> Idx n -> Bool #

(>) :: Idx n -> Idx n -> Bool #

(>=) :: Idx n -> Idx n -> Bool #

max :: Idx n -> Idx n -> Idx n #

min :: Idx n -> Idx n -> Idx n #

BoundedDims xs => Read (Idxs xs) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

BoundedDim x => Read (Idx x) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

BoundedDim n => Real (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

toRational :: Idx n -> Rational #

Show (Idxs xs) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

showsPrec :: Int -> Idxs xs -> ShowS #

show :: Idxs xs -> String #

showList :: [Idxs xs] -> ShowS #

Show (Idx x) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

showsPrec :: Int -> Idx x -> ShowS #

show :: Idx x -> String #

showList :: [Idx x] -> ShowS #

Generic (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Associated Types

type Rep (Idx n) :: Type -> Type #

Methods

from :: Idx n -> Rep (Idx n) x #

to :: Rep (Idx n) x -> Idx n #

Storable (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

Methods

sizeOf :: Idx n -> Int #

alignment :: Idx n -> Int #

peekElemOff :: Ptr (Idx n) -> Int -> IO (Idx n) #

pokeElemOff :: Ptr (Idx n) -> Int -> Idx n -> IO () #

peekByteOff :: Ptr b -> Int -> IO (Idx n) #

pokeByteOff :: Ptr b -> Int -> Idx n -> IO () #

peek :: Ptr (Idx n) -> IO (Idx n) #

poke :: Ptr (Idx n) -> Idx n -> IO () #

type Rep (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idx

type Rep (Idx n) = D1 (MetaData "Idx" "Numeric.Dimensions.Idx" "dimensions-2.0.0.0-E3TodFh6CxsCRM2bfCokxE" True) (C1 (MetaCons "Idx'" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Word)))

type Idxs (xs :: [k]) = TypedList Idx xs Source #

Type-level dimensional indexing with arbitrary Word values inside. Most of the operations on it require Dimensions constraint, because the Idxs itself does not store info about dimension bounds.

idxFromWord :: forall (k :: Type) (d :: k). BoundedDim d => Word -> Maybe (Idx d) Source #

Convert an arbitrary Word to Idx.

unsafeIdxFromWord :: forall (k :: Type) (d :: k). BoundedDim d => Word -> Idx d Source #

Convert an arbitrary Word to Idx.

If the word is outside of the bounds, fails with an error (unless unsafeindices flag is turned on).

idxToWord :: forall (k :: Type) (d :: k). Idx d -> Word Source #

Get the value of an Idx.

listIdxs :: forall (k :: Type) (xs :: [k]). Idxs xs -> [Word] Source #

idxsFromWords :: forall (k :: Type) (xs :: [k]). BoundedDims xs => [Word] -> Maybe (Idxs xs) Source #