Safe Haskell | Safe |
---|---|

Language | Haskell2010 |

## Synopsis

- class Decidable f => Discriminating f where
- disc :: f a -> [(a, b)] -> [[b]]

- newtype Group a = Group {
- getGroup :: forall m b. PrimMonad m => (b -> m (b -> m ())) -> m (a -> b -> m ())

- class Grouping a where
- class Grouping1 f where
- nub :: Grouping a => [a] -> [a]
- nubWith :: Grouping b => (a -> b) -> [a] -> [a]
- group :: Grouping a => [a] -> [[a]]
- groupWith :: Grouping b => (a -> b) -> [a] -> [[a]]
- runGroup :: Group a -> [(a, b)] -> [[b]]
- groupingEq :: Grouping a => a -> a -> Bool
- newtype Sort a = Sort {
- runSort :: forall b. [(a, b)] -> [[b]]

- class Grouping a => Sorting a where
- class Grouping1 f => Sorting1 f where
- desc :: Sort a -> Sort a
- sort :: Sorting a => [a] -> [a]
- sortWith :: Sorting b => (a -> b) -> [a] -> [a]
- sortingBag :: Foldable f => Sort k -> Sort (f k)
- sortingSet :: Foldable f => Sort k -> Sort (f k)
- sortingCompare :: Sorting a => a -> a -> Ordering
- toMap :: Sorting k => [(k, v)] -> Map k v
- toMapWith :: Sorting k => (v -> v -> v) -> [(k, v)] -> Map k v
- toMapWithKey :: Sorting k => (k -> v -> v -> v) -> [(k, v)] -> Map k v
- toIntMap :: [(Int, v)] -> IntMap v
- toIntMapWith :: (v -> v -> v) -> [(Int, v)] -> IntMap v
- toIntMapWithKey :: (Int -> v -> v -> v) -> [(Int, v)] -> IntMap v
- toSet :: Sorting k => [k] -> Set k
- toIntSet :: [Int] -> IntSet
- joining :: Discriminating f => f d -> ([a] -> [b] -> c) -> (a -> d) -> (b -> d) -> [a] -> [b] -> [c]
- inner :: Discriminating f => f d -> (a -> b -> c) -> (a -> d) -> (b -> d) -> [a] -> [b] -> [[c]]
- outer :: Discriminating f => f d -> (a -> b -> c) -> (a -> c) -> (b -> c) -> (a -> d) -> (b -> d) -> [a] -> [b] -> [[c]]
- leftOuter :: Discriminating f => f d -> (a -> b -> c) -> (a -> c) -> (a -> d) -> (b -> d) -> [a] -> [b] -> [[c]]
- rightOuter :: Discriminating f => f d -> (a -> b -> c) -> (b -> c) -> (a -> d) -> (b -> d) -> [a] -> [b] -> [[c]]

# Discrimination

class Decidable f => Discriminating f where Source #

## Instances

Discriminating Group Source # | |

Defined in Data.Discrimination.Class | |

Discriminating Sort Source # | |

Defined in Data.Discrimination.Class |

# Unordered

Productive Stable Unordered Discriminator

class Grouping a where Source #

`Eq`

equipped with a compatible stable unordered discriminator.

Nothing

## Instances

class Grouping1 f where Source #

Nothing

grouping1 :: Group a -> Group (f a) Source #

grouping1 :: Deciding1 Grouping f => Group a -> Group (f a) Source #

## Instances

Grouping1 [] Source # | |

Grouping1 Maybe Source # | |

Grouping1 Complex Source # | |

Grouping a => Grouping1 (Either a) Source # | |

Grouping a => Grouping1 ((,) a) Source # | |

(Grouping a, Grouping b) => Grouping1 ((,,) a b) Source # | |

(Grouping a, Grouping b, Grouping c) => Grouping1 ((,,,) a b c) Source # | |

(Grouping1 f, Grouping1 g) => Grouping1 (Compose f g) Source # | |

groupWith :: Grouping b => (a -> b) -> [a] -> [[a]] Source #

*O(n)*. This is a replacement for `groupWith`

using discrimination.

The result equivalence classes are **not** sorted, but the grouping is stable.

# Ordered

Stable Ordered Discriminator

class Grouping a => Sorting a where Source #

`Ord`

equipped with a compatible stable, ordered discriminator.

Nothing

## Instances

Sorting Bool Source # | |

Sorting Char Source # | |

Sorting Int Source # | |

Sorting Int8 Source # | |

Sorting Int16 Source # | |

Sorting Int32 Source # | |

Sorting Int64 Source # | |

Sorting Integer Source # | |

Sorting Natural Source # | |

Sorting Word Source # | |

Sorting Word8 Source # | |

Sorting Word16 Source # | |

Sorting Word32 Source # | |

Sorting Word64 Source # | |

Sorting () Source # | |

Defined in Data.Discrimination.Sorting | |

Sorting Void Source # | |

Sorting a => Sorting [a] Source # | |

Defined in Data.Discrimination.Sorting | |

Sorting a => Sorting (Maybe a) Source # | |

(Sorting a, Sorting b) => Sorting (Either a b) Source # | |

(Sorting a, Sorting b) => Sorting (a, b) Source # | |

Defined in Data.Discrimination.Sorting | |

(Sorting a, Sorting b, Sorting c) => Sorting (a, b, c) Source # | |

Defined in Data.Discrimination.Sorting | |

(Sorting a, Sorting b, Sorting c, Sorting d) => Sorting (a, b, c, d) Source # | |

Defined in Data.Discrimination.Sorting | |

(Sorting1 f, Sorting1 g, Sorting a) => Sorting (Compose f g a) Source # | |

class Grouping1 f => Sorting1 f where Source #

Nothing

sorting1 :: Sort a -> Sort (f a) Source #

sorting1 :: Deciding1 Sorting f => Sort a -> Sort (f a) Source #

sortingBag :: Foldable f => Sort k -> Sort (f k) Source #

Construct a stable ordered discriminator that sorts a list as multisets of elements from another stable ordered discriminator.

The resulting discriminator only cares about the set of keys and their multiplicity, and is sorted as if we'd sorted each key in turn before comparing.

sortingSet :: Foldable f => Sort k -> Sort (f k) Source #

Construct a stable ordered discriminator that sorts a list as sets of elements from another stable ordered discriminator.

The resulting discriminator only cares about the set of keys, and is sorted as if we'd sorted each key in turn before comparing.

sortingCompare :: Sorting a => a -> a -> Ordering Source #

# Container Construction

toMapWith :: Sorting k => (v -> v -> v) -> [(k, v)] -> Map k v Source #

*O(n)*. Construct a `Map`

, combining values.

This is an asymptotically faster version of `fromListWith`

, which exploits ordered discrimination.

(Note: values combine in anti-stable order for compatibility with `fromListWith`

)

`>>>`

fromList [(3, "ab"), (5, "cba")]`toMapWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5 :: Int,"c")]`

`>>>`

True`toMapWith (++) [] == empty`

toMapWithKey :: Sorting k => (k -> v -> v -> v) -> [(k, v)] -> Map k v Source #

*O(n)*. Construct a `Map`

, combining values with access to the key.

This is an asymptotically faster version of `fromListWithKey`

, which exploits ordered discrimination.

(Note: the values combine in anti-stable order for compatibility with `fromListWithKey`

)

`>>>`

`let f key new_value old_value = show key ++ ":" ++ new_value ++ "|" ++ old_value`

`>>>`

fromList [(3, "3:a|b"), (5, "5:c|5:b|a")]`toMapWithKey f [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5 :: Int,"c")]`

`>>>`

True`toMapWithKey f [] == empty`

toIntMap :: [(Int, v)] -> IntMap v Source #

*O(n)*. Construct an `IntMap`

.

`>>>`

True`toIntMap [] == empty`

`>>>`

fromList [(5,"c"), (3,"b")]`toIntMap [(5,"a"), (3,"b"), (5, "c")]`

`>>>`

fromList [(5,"a"), (3,"b")]`toIntMap [(5,"c"), (3,"b"), (5, "a")]`

toIntMapWith :: (v -> v -> v) -> [(Int, v)] -> IntMap v Source #

*O(n)*. Construct an `IntMap`

, combining values.

This is an asymptotically faster version of `fromListWith`

, which exploits ordered discrimination.

(Note: values combine in anti-stable order for compatibility with `fromListWith`

)

`>>>`

fromList [(3, "ab"), (5, "cba")]`toIntMapWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"c")]`

`>>>`

True`toIntMapWith (++) [] == empty`

toIntMapWithKey :: (Int -> v -> v -> v) -> [(Int, v)] -> IntMap v Source #

*O(n)*. Construct a `Map`

, combining values with access to the key.

This is an asymptotically faster version of `fromListWithKey`

, which exploits ordered discrimination.

(Note: the values combine in anti-stable order for compatibility with `fromListWithKey`

)

`>>>`

`let f key new_value old_value = show key ++ ":" ++ new_value ++ "|" ++ old_value`

`>>>`

fromList [(3, "3:a|b"), (5, "5:c|5:b|a")]`toIntMapWithKey f [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"c")]`

`>>>`

True`toIntMapWithKey f [] == empty`

# Joins

:: Discriminating f | |

=> f d | the discriminator to use |

-> ([a] -> [b] -> c) | how to join two tables |

-> (a -> d) | selector for the left table |

-> (b -> d) | selector for the right table |

-> [a] | left table |

-> [b] | right table |

-> [c] |

*O(n)*. Perform a full outer join while explicit merging of the two result tables a table at a time.

The results are grouped by the discriminator.

:: Discriminating f | |

=> f d | the discriminator to use |

-> (a -> b -> c) | how to join two rows |

-> (a -> d) | selector for the left table |

-> (b -> d) | selector for the right table |

-> [a] | left table |

-> [b] | right table |

-> [[c]] |

*O(n)*. Perform an inner join, with operations defined one row at a time.

The results are grouped by the discriminator.

This takes operation time linear in both the input and result sets.

:: Discriminating f | |

=> f d | the discriminator to use |

-> (a -> b -> c) | how to join two rows |

-> (a -> c) | row present on the left, missing on the right |

-> (b -> c) | row present on the right, missing on the left |

-> (a -> d) | selector for the left table |

-> (b -> d) | selector for the right table |

-> [a] | left table |

-> [b] | right table |

-> [[c]] |

*O(n)*. Perform a full outer join with operations defined one row at a time.

The results are grouped by the discriminator.

This takes operation time linear in both the input and result sets.

:: Discriminating f | |

=> f d | the discriminator to use |

-> (a -> b -> c) | how to join two rows |

-> (a -> c) | row present on the left, missing on the right |

-> (a -> d) | selector for the left table |

-> (b -> d) | selector for the right table |

-> [a] | left table |

-> [b] | right table |

-> [[c]] |

*O(n)*. Perform a left outer join with operations defined one row at a time.

The results are grouped by the discriminator.

This takes operation time linear in both the input and result sets.

:: Discriminating f | |

=> f d | the discriminator to use |

-> (a -> b -> c) | how to join two rows |

-> (b -> c) | row present on the right, missing on the left |

-> (a -> d) | selector for the left table |

-> (b -> d) | selector for the right table |

-> [a] | left table |

-> [b] | right table |

-> [[c]] |

*O(n)*. Perform a right outer join with operations defined one row at a time.

The results are grouped by the discriminator.

This takes operation time linear in both the input and result sets.