base-4.8.2.0: Basic libraries

Data.Ix

Description

The `Ix` class is used to map a contiguous subrange of values in type onto integers. It is used primarily for array indexing (see the array package). `Ix` uses row-major order.

Synopsis

# The `Ix` class

class Ord a => Ix a where Source

The `Ix` class is used to map a contiguous subrange of values in a type onto integers. It is used primarily for array indexing (see the array package).

The first argument `(l,u)` of each of these operations is a pair specifying the lower and upper bounds of a contiguous subrange of values.

An implementation is entitled to assume the following laws about these operations:

• `inRange (l,u) i == elem i (range (l,u))` ` `
• `range (l,u) !! index (l,u) i == i`, when `inRange (l,u) i`
• `map (index (l,u)) (range (l,u))) == [0..rangeSize (l,u)-1]` ` `
• `rangeSize (l,u) == length (range (l,u))` ` `

Minimal complete definition

range, (index | unsafeIndex), inRange

Methods

range :: (a, a) -> [a] Source

The list of values in the subrange defined by a bounding pair.

index :: (a, a) -> a -> Int Source

The position of a subscript in the subrange.

inRange :: (a, a) -> a -> Bool Source

Returns `True` the given subscript lies in the range defined the bounding pair.

rangeSize :: (a, a) -> Int Source

The size of the subrange defined by a bounding pair.

Instances

 Ix () (Ix a, Ix b) => Ix (a, b) Ix (Proxy k s) (Ix a1, Ix a2, Ix a3) => Ix (a1, a2, a3) (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1, a2, a3, a4) (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1, a2, a3, a4, a5)

# Deriving Instances of `Ix`

Derived instance declarations for the class `Ix` are only possible for enumerations (i.e. datatypes having only nullary constructors) and single-constructor datatypes, including arbitrarily large tuples, whose constituent types are instances of `Ix`.

• For an enumeration, the nullary constructors are assumed to be numbered left-to-right with the indices being 0 to n-1 inclusive. This is the same numbering defined by the `Enum` class. For example, given the datatype:
`       data Colour = Red | Orange | Yellow | Green | Blue | Indigo | Violet`

we would have:

```       range   (Yellow,Blue)        ==  [Yellow,Green,Blue]
index   (Yellow,Blue) Green  ==  1
inRange (Yellow,Blue) Red    ==  False```