Agda-2.8.0: A dependently typed functional programming language and proof assistant

Safe Haskell | None
Language | Haskell2010

Agda.Utils.Favorites

Description

Maintaining a list of favorites of some partially ordered type. Only the best elements are kept.

To avoid name clashes, import this module qualified, as in `import Agda.Utils.Favorites (Favorites) import qualified Agda.Utils.Favorites as Fav`

Synopsis

- newtype Favorites a = Favorites {
  - toList :: [a]
  }
- data CompareResult a
  - = Dominates {
    - dominated :: [a]
    - notDominated :: [a]
    }
  - | IsDominated {
    - dominator :: a
    }
- compareWithFavorites :: PartialOrd a => a -> Favorites a -> CompareResult a
- compareFavorites :: PartialOrd a => Favorites a -> Favorites a -> (Favorites a, Favorites a)
- unionCompared :: (Favorites a, Favorites a) -> Favorites a
- insertCompared :: a -> Favorites a -> CompareResult a -> Favorites a
- insert :: PartialOrd a => a -> Favorites a -> Favorites a
- union :: PartialOrd a => Favorites a -> Favorites a -> Favorites a
- fromList :: PartialOrd a => [a] -> Favorites a

# Documentation

newtype Favorites a Source #

A list of incomparable favorites.

Constructors

Favorites |

Fields

- toList :: [a]

#### Instances

Instances details

Foldable Favorites Source # |

Instance details

Defined in Agda.Utils.Favorites

Methods

fold :: Monoid m => Favorites m -> m Source #

foldMap :: Monoid m => (a -> m) -> Favorites a -> m Source #

foldMap' :: Monoid m => (a -> m) -> Favorites a -> m Source #

foldr :: (a -> b -> b) -> b -> Favorites a -> b Source #

foldr' :: (a -> b -> b) -> b -> Favorites a -> b Source #

foldl :: (b -> a -> b) -> b -> Favorites a -> b Source #

foldl' :: (b -> a -> b) -> b -> Favorites a -> b Source #

foldr1 :: (a -> a -> a) -> Favorites a -> a Source #

foldl1 :: (a -> a -> a) -> Favorites a -> a Source #

toList :: Favorites a -> [a] Source #

null :: Favorites a -> Bool Source #

length :: Favorites a -> Int Source #

elem :: Eq a => a -> Favorites a -> Bool Source #

maximum :: Ord a => Favorites a -> a Source #

minimum :: Ord a => Favorites a -> a Source #

sum :: Num a => Favorites a -> a Source #

product :: Num a => Favorites a -> a Source #

Singleton a (Favorites a) Source # |
Instance details Defined in Agda.Utils.Favorites Methods singleton :: a -> Favorites a Source #
Null (Favorites a) Source # |
Instance details Defined in Agda.Utils.Favorites Methods empty :: Favorites a Source # null :: Favorites a -> Bool Source #
PartialOrd a => Monoid (Favorites a) Source # |
Instance details Defined in Agda.Utils.Favorites Methods mempty :: Favorites a Source # mappend :: Favorites a -> Favorites a -> Favorites a Source # mconcat :: [Favorites a] -> Favorites a Source #
PartialOrd a => Semigroup (Favorites a) Source # | `Favorites` forms a `Monoid` under `empty` and 'union.
Instance details Defined in Agda.Utils.Favorites Methods (<>) :: Favorites a -> Favorites a -> Favorites a Source # sconcat :: NonEmpty (Favorites a) -> Favorites a Source # stimes :: Integral b => b -> Favorites a -> Favorites a Source #
Show a => Show (Favorites a) Source # |
Instance details Defined in Agda.Utils.Favorites Methods showsPrec :: Int -> Favorites a -> ShowS Source # show :: Favorites a -> String Source # showList :: [Favorites a] -> ShowS Source #
Ord a => Eq (Favorites a) Source # | Equality checking is a bit expensive, since we need to sort! Maybe use a `Set` of favorites in the first place?
Instance details Defined in Agda.Utils.Favorites Methods (==) :: Favorites a -> Favorites a -> Bool Source # (/=) :: Favorites a -> Favorites a -> Bool Source #

data CompareResult a Source #

Result of comparing a candidate with the current favorites.

Constructors

Dominates | Great, you are dominating a possibly (empty list of favorites) but there is also a rest that is not dominated. If `null dominated`, then `notDominated` is necessarily the complete list of favorites.

Fields

- dominated :: [a]
- notDominated :: [a]

IsDominated | Sorry, but you are dominated by that favorite.

Fields

- dominator :: a

compareWithFavorites :: PartialOrd a => a -> Favorites a -> CompareResult a Source #

Gosh, got some pretty `a` here, compare with my current favorites! Discard it if there is already one that is better or equal. (Skewed conservatively: faithful to the old favorites.) If there is no match for it, add it, and dispose of all that are worse than `a`.

We require a partial ordering. Less is better! (Maybe paradoxically.)

compareFavorites :: PartialOrd a => Favorites a -> Favorites a -> (Favorites a, Favorites a) Source #

Compare a new set of favorites to an old one and discard the new favorites that are dominated by the old ones and vice verse. (Skewed conservatively: faithful to the old favorites.)

    compareFavorites new old = (new', old')

unionCompared :: (Favorites a, Favorites a) -> Favorites a Source #

insertCompared :: a -> Favorites a -> CompareResult a -> Favorites a Source #

After comparing, do the actual insertion.

insert :: PartialOrd a => a -> Favorites a -> Favorites a Source #

Compare, then insert accordingly. `insert a l = insertCompared a l (compareWithFavorites a l)`

union :: PartialOrd a => Favorites a -> Favorites a -> Favorites a Source #

Insert all the favorites from the first list into the second.

fromList :: PartialOrd a => [a] -> Favorites a Source #

Construct favorites from elements of a partial order. The result depends on the order of the list if it contains equal elements, since earlier seen elements are favored over later seen equals. The first element of the list is seen first.