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

Copyright(c) Artem Chirkin
LicenseBSD3
Maintainerchirkin@arch.ethz.ch
Safe HaskellNone
LanguageHaskell2010

Numeric.Dimensions.Idxs

Contents

Description

Provides a data type Idx that enumerates through multiple dimensions. Lower indices go first, i.e. assumed enumeration is i = i1 + i2*n1 + i3*n1*n2 + ... + ik*n1*n2*...*n(k-1). This is also to encourage column-first matrix enumeration and array layout.

Synopsis

Data types

newtype Idx n Source #

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

Note, this type has a weird Enum instance:

>>> fromEnum (Idx 7)
6

The logic behind this is that the Enum class is used to transform indices to offsets. That is, element of an array at index k :: Idx n is the element taken by an offset `k - 1 :: Int`.

Constructors

Idx 

Fields

Instances
Generic1 (Idx :: k -> *) Source # 
Instance details

Defined in Numeric.Dimensions.Idxs

Associated Types

type Rep1 Idx :: k -> * #

Methods

from1 :: Idx a -> Rep1 Idx a #

to1 :: Rep1 Idx a -> Idx a #

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

Defined in Numeric.Dimensions.Idxs

Methods

minBound :: Idxs ds #

maxBound :: Idxs ds #

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

Defined in Numeric.Dimensions.Idxs

Methods

minBound :: Idx n #

maxBound :: Idx n #

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

Defined in Numeric.Dimensions.Idxs

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] #

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

Defined in Numeric.Dimensions.Idxs

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.Idxs

Methods

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

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

Eq (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idxs

Methods

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

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

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

Defined in Numeric.Dimensions.Idxs

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.Idxs

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) #

KnownDim 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.Idxs

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 ': []) #

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

Defined in Numeric.Dimensions.Idxs

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 last dimension to the first dimension (the last dimension is the most significant one) O(Length xs).

Literally,

compare a b = compare (reverse $ listIdxs a) (reverse $ listIdxs b)

This is the same compare rule, as for Dims. Another reason to reverse the list of indices is to have a consistent behavior when calculating index offsets:

sort == sortOn fromEnum
Instance details

Defined in Numeric.Dimensions.Idxs

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.Idxs

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 #

Read (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idxs

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

Defined in Numeric.Dimensions.Idxs

Methods

toRational :: Idx n -> Rational #

Show (Idxs xs) Source # 
Instance details

Defined in Numeric.Dimensions.Idxs

Methods

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

show :: Idxs xs -> String #

showList :: [Idxs xs] -> ShowS #

Show (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idxs

Methods

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

show :: Idx n -> String #

showList :: [Idx n] -> ShowS #

Generic (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idxs

Associated Types

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

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.Idxs

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 Rep1 (Idx :: k -> *) Source # 
Instance details

Defined in Numeric.Dimensions.Idxs

type Rep1 (Idx :: k -> *) = D1 (MetaData "Idx" "Numeric.Dimensions.Idxs" "dimensions-1.0.1.1-7RcT9arRqD18mMNFhSmcR" True) (C1 (MetaCons "Idx" PrefixI True) (S1 (MetaSel (Just "unIdx") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Word)))
type Rep (Idx n) Source # 
Instance details

Defined in Numeric.Dimensions.Idxs

type Rep (Idx n) = D1 (MetaData "Idx" "Numeric.Dimensions.Idxs" "dimensions-1.0.1.1-7RcT9arRqD18mMNFhSmcR" True) (C1 (MetaCons "Idx" PrefixI True) (S1 (MetaSel (Just "unIdx") 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.

Note, this type has a special Enum instance: fromEnum gives an offset of the index in a flat 1D array; this is in line with a weird Enum instance of Idx type.

idxFromWord :: forall d. KnownDim d => Word -> Maybe (Idx d) Source #

unsafeIdxFromWord :: forall d. KnownDim d => Word -> Idx d Source #

idxsFromWords :: forall ds. Dimensions ds => [Word] -> Maybe (Idx ds) Source #

Re-export dimensions types