base-4.10.1.0: Basic libraries

Copyright | (c) The University of Glasgow 2001
License | BSD-style (see the file libraries/base/LICENSE)
Maintainer | libraries@haskell.org
Stability | stable
Portability | portable
Safe Haskell | Trustworthy
Language | Haskell2010

Data.Ix

Contents

- The `Ix` class
- Deriving Instances of `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

- class Ord a => Ix a where

# The `Ix` class

class Ord a => Ix a where #

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

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

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

The position of a subscript in the subrange.

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

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

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

The size of the subrange defined by a bounding pair.

Instances

Ix Bool # | Since: 2.1
Methods range :: (Bool, Bool) -> [Bool] # index :: (Bool, Bool) -> Bool -> Int # unsafeIndex :: (Bool, Bool) -> Bool -> Int inRange :: (Bool, Bool) -> Bool -> Bool # rangeSize :: (Bool, Bool) -> Int # unsafeRangeSize :: (Bool, Bool) -> Int
Ix Char # | Since: 2.1
Methods range :: (Char, Char) -> [Char] # index :: (Char, Char) -> Char -> Int # unsafeIndex :: (Char, Char) -> Char -> Int inRange :: (Char, Char) -> Char -> Bool # rangeSize :: (Char, Char) -> Int # unsafeRangeSize :: (Char, Char) -> Int
Ix Int # | Since: 2.1
Methods range :: (Int, Int) -> [Int] # index :: (Int, Int) -> Int -> Int # unsafeIndex :: (Int, Int) -> Int -> Int inRange :: (Int, Int) -> Int -> Bool # rangeSize :: (Int, Int) -> Int # unsafeRangeSize :: (Int, Int) -> Int
Ix Int8 # | Since: 2.1
Methods range :: (Int8, Int8) -> [Int8] # index :: (Int8, Int8) -> Int8 -> Int # unsafeIndex :: (Int8, Int8) -> Int8 -> Int inRange :: (Int8, Int8) -> Int8 -> Bool # rangeSize :: (Int8, Int8) -> Int # unsafeRangeSize :: (Int8, Int8) -> Int
Ix Int16 # | Since: 2.1
Methods range :: (Int16, Int16) -> [Int16] # index :: (Int16, Int16) -> Int16 -> Int # unsafeIndex :: (Int16, Int16) -> Int16 -> Int inRange :: (Int16, Int16) -> Int16 -> Bool # rangeSize :: (Int16, Int16) -> Int # unsafeRangeSize :: (Int16, Int16) -> Int
Ix Int32 # | Since: 2.1
Methods range :: (Int32, Int32) -> [Int32] # index :: (Int32, Int32) -> Int32 -> Int # unsafeIndex :: (Int32, Int32) -> Int32 -> Int inRange :: (Int32, Int32) -> Int32 -> Bool # rangeSize :: (Int32, Int32) -> Int # unsafeRangeSize :: (Int32, Int32) -> Int
Ix Int64 # | Since: 2.1
Methods range :: (Int64, Int64) -> [Int64] # index :: (Int64, Int64) -> Int64 -> Int # unsafeIndex :: (Int64, Int64) -> Int64 -> Int inRange :: (Int64, Int64) -> Int64 -> Bool # rangeSize :: (Int64, Int64) -> Int # unsafeRangeSize :: (Int64, Int64) -> Int
Ix Integer # | Since: 2.1
Methods range :: (Integer, Integer) -> [Integer] # index :: (Integer, Integer) -> Integer -> Int # unsafeIndex :: (Integer, Integer) -> Integer -> Int inRange :: (Integer, Integer) -> Integer -> Bool # rangeSize :: (Integer, Integer) -> Int # unsafeRangeSize :: (Integer, Integer) -> Int
Ix Natural # | Since: 4.8.0.0
Methods range :: (Natural, Natural) -> [Natural] # index :: (Natural, Natural) -> Natural -> Int # unsafeIndex :: (Natural, Natural) -> Natural -> Int inRange :: (Natural, Natural) -> Natural -> Bool # rangeSize :: (Natural, Natural) -> Int # unsafeRangeSize :: (Natural, Natural) -> Int
Ix Ordering # | Since: 2.1
Methods range :: (Ordering, Ordering) -> [Ordering] # index :: (Ordering, Ordering) -> Ordering -> Int # unsafeIndex :: (Ordering, Ordering) -> Ordering -> Int inRange :: (Ordering, Ordering) -> Ordering -> Bool # rangeSize :: (Ordering, Ordering) -> Int # unsafeRangeSize :: (Ordering, Ordering) -> Int
Ix Word # | Since: 4.6.0.0
Methods range :: (Word, Word) -> [Word] # index :: (Word, Word) -> Word -> Int # unsafeIndex :: (Word, Word) -> Word -> Int inRange :: (Word, Word) -> Word -> Bool # rangeSize :: (Word, Word) -> Int # unsafeRangeSize :: (Word, Word) -> Int
Ix Word8 # | Since: 2.1
Methods range :: (Word8, Word8) -> [Word8] # index :: (Word8, Word8) -> Word8 -> Int # unsafeIndex :: (Word8, Word8) -> Word8 -> Int inRange :: (Word8, Word8) -> Word8 -> Bool # rangeSize :: (Word8, Word8) -> Int # unsafeRangeSize :: (Word8, Word8) -> Int
Ix Word16 # | Since: 2.1
Methods range :: (Word16, Word16) -> [Word16] # index :: (Word16, Word16) -> Word16 -> Int # unsafeIndex :: (Word16, Word16) -> Word16 -> Int inRange :: (Word16, Word16) -> Word16 -> Bool # rangeSize :: (Word16, Word16) -> Int # unsafeRangeSize :: (Word16, Word16) -> Int
Ix Word32 # | Since: 2.1
Methods range :: (Word32, Word32) -> [Word32] # index :: (Word32, Word32) -> Word32 -> Int # unsafeIndex :: (Word32, Word32) -> Word32 -> Int inRange :: (Word32, Word32) -> Word32 -> Bool # rangeSize :: (Word32, Word32) -> Int # unsafeRangeSize :: (Word32, Word32) -> Int
Ix Word64 # | Since: 2.1
Methods range :: (Word64, Word64) -> [Word64] # index :: (Word64, Word64) -> Word64 -> Int # unsafeIndex :: (Word64, Word64) -> Word64 -> Int inRange :: (Word64, Word64) -> Word64 -> Bool # rangeSize :: (Word64, Word64) -> Int # unsafeRangeSize :: (Word64, Word64) -> Int
Ix () # | Since: 2.1
Methods range :: ((), ()) -> [()] # index :: ((), ()) -> () -> Int # unsafeIndex :: ((), ()) -> () -> Int inRange :: ((), ()) -> () -> Bool # rangeSize :: ((), ()) -> Int # unsafeRangeSize :: ((), ()) -> Int
Ix GeneralCategory # |

Methods

range :: (GeneralCategory, GeneralCategory) -> [GeneralCategory] #

index :: (GeneralCategory, GeneralCategory) -> GeneralCategory -> Int #

unsafeIndex :: (GeneralCategory, GeneralCategory) -> GeneralCategory -> Int

inRange :: (GeneralCategory, GeneralCategory) -> GeneralCategory -> Bool #

rangeSize :: (GeneralCategory, GeneralCategory) -> Int #

unsafeRangeSize :: (GeneralCategory, GeneralCategory) -> Int

Ix IOMode # |
Methods range :: (IOMode, IOMode) -> [IOMode] # index :: (IOMode, IOMode) -> IOMode -> Int # unsafeIndex :: (IOMode, IOMode) -> IOMode -> Int inRange :: (IOMode, IOMode) -> IOMode -> Bool # rangeSize :: (IOMode, IOMode) -> Int # unsafeRangeSize :: (IOMode, IOMode) -> Int
Ix DecidedStrictness # |

Methods

range :: (DecidedStrictness, DecidedStrictness) -> [DecidedStrictness] #

index :: (DecidedStrictness, DecidedStrictness) -> DecidedStrictness -> Int #

unsafeIndex :: (DecidedStrictness, DecidedStrictness) -> DecidedStrictness -> Int

inRange :: (DecidedStrictness, DecidedStrictness) -> DecidedStrictness -> Bool #

rangeSize :: (DecidedStrictness, DecidedStrictness) -> Int #

unsafeRangeSize :: (DecidedStrictness, DecidedStrictness) -> Int

Ix SourceStrictness # |

Methods

range :: (SourceStrictness, SourceStrictness) -> [SourceStrictness] #

index :: (SourceStrictness, SourceStrictness) -> SourceStrictness -> Int #

unsafeIndex :: (SourceStrictness, SourceStrictness) -> SourceStrictness -> Int

inRange :: (SourceStrictness, SourceStrictness) -> SourceStrictness -> Bool #

rangeSize :: (SourceStrictness, SourceStrictness) -> Int #

unsafeRangeSize :: (SourceStrictness, SourceStrictness) -> Int

Ix SourceUnpackedness # |

Methods

range :: (SourceUnpackedness, SourceUnpackedness) -> [SourceUnpackedness] #

index :: (SourceUnpackedness, SourceUnpackedness) -> SourceUnpackedness -> Int #

unsafeIndex :: (SourceUnpackedness, SourceUnpackedness) -> SourceUnpackedness -> Int

inRange :: (SourceUnpackedness, SourceUnpackedness) -> SourceUnpackedness -> Bool #

rangeSize :: (SourceUnpackedness, SourceUnpackedness) -> Int #

unsafeRangeSize :: (SourceUnpackedness, SourceUnpackedness) -> Int

Ix Associativity # |
Methods range :: (Associativity, Associativity) -> [Associativity] # index :: (Associativity, Associativity) -> Associativity -> Int # unsafeIndex :: (Associativity, Associativity) -> Associativity -> Int inRange :: (Associativity, Associativity) -> Associativity -> Bool # rangeSize :: (Associativity, Associativity) -> Int # unsafeRangeSize :: (Associativity, Associativity) -> Int
Ix SeekMode # |
Methods range :: (SeekMode, SeekMode) -> [SeekMode] # index :: (SeekMode, SeekMode) -> SeekMode -> Int # unsafeIndex :: (SeekMode, SeekMode) -> SeekMode -> Int inRange :: (SeekMode, SeekMode) -> SeekMode -> Bool # rangeSize :: (SeekMode, SeekMode) -> Int # unsafeRangeSize :: (SeekMode, SeekMode) -> Int
Ix Void # | Since: 4.8.0.0
Methods range :: (Void, Void) -> [Void] # index :: (Void, Void) -> Void -> Int # unsafeIndex :: (Void, Void) -> Void -> Int inRange :: (Void, Void) -> Void -> Bool # rangeSize :: (Void, Void) -> Int # unsafeRangeSize :: (Void, Void) -> Int
Ix a => Ix (Identity a) # |
Methods range :: (Identity a, Identity a) -> [Identity a] # index :: (Identity a, Identity a) -> Identity a -> Int # unsafeIndex :: (Identity a, Identity a) -> Identity a -> Int inRange :: (Identity a, Identity a) -> Identity a -> Bool # rangeSize :: (Identity a, Identity a) -> Int # unsafeRangeSize :: (Identity a, Identity a) -> Int
(Ix a, Ix b) => Ix (a, b) # | Since: 2.1
Methods range :: ((a, b), (a, b)) -> [(a, b)] # index :: ((a, b), (a, b)) -> (a, b) -> Int # unsafeIndex :: ((a, b), (a, b)) -> (a, b) -> Int inRange :: ((a, b), (a, b)) -> (a, b) -> Bool # rangeSize :: ((a, b), (a, b)) -> Int # unsafeRangeSize :: ((a, b), (a, b)) -> Int
Ix (Proxy k s) # | Since: 4.7.0.0
Methods range :: (Proxy k s, Proxy k s) -> [Proxy k s] # index :: (Proxy k s, Proxy k s) -> Proxy k s -> Int # unsafeIndex :: (Proxy k s, Proxy k s) -> Proxy k s -> Int inRange :: (Proxy k s, Proxy k s) -> Proxy k s -> Bool # rangeSize :: (Proxy k s, Proxy k s) -> Int # unsafeRangeSize :: (Proxy k s, Proxy k s) -> Int
(Ix a1, Ix a2, Ix a3) => Ix (a1, a2, a3) # | Since: 2.1
Methods range :: ((a1, a2, a3), (a1, a2, a3)) -> [(a1, a2, a3)] # index :: ((a1, a2, a3), (a1, a2, a3)) -> (a1, a2, a3) -> Int # unsafeIndex :: ((a1, a2, a3), (a1, a2, a3)) -> (a1, a2, a3) -> Int inRange :: ((a1, a2, a3), (a1, a2, a3)) -> (a1, a2, a3) -> Bool # rangeSize :: ((a1, a2, a3), (a1, a2, a3)) -> Int # unsafeRangeSize :: ((a1, a2, a3), (a1, a2, a3)) -> Int
Ix a => Ix (Const k a b) # |
Methods range :: (Const k a b, Const k a b) -> [Const k a b] # index :: (Const k a b, Const k a b) -> Const k a b -> Int # unsafeIndex :: (Const k a b, Const k a b) -> Const k a b -> Int inRange :: (Const k a b, Const k a b) -> Const k a b -> Bool # rangeSize :: (Const k a b, Const k a b) -> Int # unsafeRangeSize :: (Const k a b, Const k a b) -> Int
(Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1, a2, a3, a4) # | Since: 2.1

Methods

range :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> [(a1, a2, a3, a4)] #

index :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> (a1, a2, a3, a4) -> Int #

unsafeIndex :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> (a1, a2, a3, a4) -> Int

inRange :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> (a1, a2, a3, a4) -> Bool #

rangeSize :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> Int #

unsafeRangeSize :: ((a1, a2, a3, a4), (a1, a2, a3, a4)) -> Int

(Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1, a2, a3, a4, a5) # | Since: 2.1

Methods

range :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> [(a1, a2, a3, a4, a5)] #

index :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> (a1, a2, a3, a4, a5) -> Int #

unsafeIndex :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> (a1, a2, a3, a4, a5) -> Int

inRange :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> (a1, a2, a3, a4, a5) -> Bool #

rangeSize :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> Int #

unsafeRangeSize :: ((a1, a2, a3, a4, a5), (a1, a2, a3, a4, a5)) -> Int

# 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

- For single-constructor datatypes, the derived instance declarations are as shown for tuples in chapter 19, section 2 of the Haskell 2010 report: https://www.haskell.org/onlinereport/haskell2010/haskellch19.html.