Stability | experimental |
---|---|

Maintainer | Patrick Perry <patperry@stanford.edu> |

- data Permutation
- permutation :: Int -> [Int] -> Permutation
- identity :: Int -> Permutation
- inverse :: Permutation -> Permutation
- size :: Permutation -> Int
- apply :: Permutation -> Int -> Int
- applyWith :: Monad m => (Int -> Int -> m ()) -> Permutation -> m ()
- invertWith :: Monad m => (Int -> Int -> m ()) -> Permutation -> m ()
- fromForeignPtr :: Int -> ForeignPtr Int -> Int -> Permutation
- toForeignPtr :: Permutation -> (Int, ForeignPtr Int, Int)
- toList :: Permutation -> [Int]
- fromList :: [Int] -> Permutation
- withPermutationPtr :: Permutation -> (Ptr Int -> IO a) -> IO a
- unsafePermutation :: Int -> [Int] -> Permutation
- unsafeApply :: Permutation -> Int -> Int

# The Permutation type

data Permutation Source

Represents a permutation of the integers `[0..n)`

.

# Creating permutations

permutation :: Int -> [Int] -> PermutationSource

Create a permutation from a list of values. The list must be of length
`n`

and contain each integer in `{0, 1, ..., (n-1) }`

exactly once.
The permutation that is returned will send the integer `i`

to its index
in the list.

identity :: Int -> PermutationSource

Create an identity permutation of the given size.

inverse :: Permutation -> PermutationSource

Get the inverse of a permutation.

# Permutation properties

size :: Permutation -> IntSource

Get the size of the permutation.

apply :: Permutation -> Int -> IntSource

Apply a permutation to an integer. The integer must be in the range
`[0..n)`

.

# Applying permutations

applyWith :: Monad m => (Int -> Int -> m ()) -> Permutation -> m ()Source

`applyWith swap perm`

applies the permutation as a sequence of swaps. After
this function is applied, `OUT[i] = IN[P[i]]`

invertWith :: Monad m => (Int -> Int -> m ()) -> Permutation -> m ()Source

`invertWith swap p`

applies the inverse of the permutation as a
sequence of swaps. After this function is applied, `OUT[P[i]] = IN[i]`

# Converstion to/from other types

`ForeignPtr`

s

fromForeignPtr :: Int -> ForeignPtr Int -> Int -> PermutationSource

Convert size and raw array to a permutation. No validation is performed on the arguments.

toForeignPtr :: Permutation -> (Int, ForeignPtr Int, Int)Source

Get the size, raw data array and offset

## Lists

toList :: Permutation -> [Int]Source

fromList :: [Int] -> PermutationSource

# Unsafe operations

withPermutationPtr :: Permutation -> (Ptr Int -> IO a) -> IO aSource

Perform an operation, given a pointer to the start of the permutation data

unsafePermutation :: Int -> [Int] -> PermutationSource

Same as `permutation`

, but does not check that the inputs are valid.

unsafeApply :: Permutation -> Int -> IntSource

Same as `apply`

but does not range-check the argument.