Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add minimumOn and maximumOn functions (Issue #331) #356

Merged
merged 7 commits into from
Jan 17, 2021
Merged

Add minimumOn and maximumOn functions (Issue #331) #356

merged 7 commits into from
Jan 17, 2021

Conversation

claudi
Copy link
Contributor

@claudi claudi commented Jan 16, 2021

Implements the minimumOn and maximumOn function requested in the mentioned request, using the implementation described in the reply. It also adds tests, documentation and benchmarks for the mentioned functions.

This is my first contribution to an open source project. Hopefully everything is alright.

Definition taken from issue #331
Since the type of the test inputs seems to not be constant, the function
we sort on mush be trivial, meaning it has to be the identity
Data/Vector.hs Outdated Show resolved Hide resolved
benchmarks/Main.hs Outdated Show resolved Hide resolved
@Bodigrim
Copy link
Contributor

Thanks for tests and benchmarks :) You are very welcome to contribute.

@Boarders
Copy link
Contributor

Thanks for adding this @claudi! :)

Instead of having two synonyms for minimumOn and maximumOn, importing
the Vector.Unboxed module in an intermediary and otherwise useless
module, we can call the functions directly for the original module.
@lehins
Copy link
Contributor

lehins commented Jan 17, 2021

Way to go with a first contribution @claudi Keep up the good work ;)

Normally I'd also ask for an entry in changelog, but this time I'm gonna have to do it myself anyways, so no worries on it.

@lehins lehins merged commit a91fe1d into haskell:master Jan 17, 2021
@claudi claudi deleted the 331-minimumOn-maximumOn branch January 17, 2021 14:00
@Shimuuar
Copy link
Contributor

@lehins Too fast :) implementation doesn't match documentation

>>> maximumOn fst $ Data.Vector.fromList [(1,1), (1,2)]
(1,2)
>>> minimumOn fst $ Data.Vector.fromList [(1,1), (1,2)]
(1,1)

@claudi never mind about bug. I'm going to add doctest for that behavior. This is good case for tool for copying haddocks I made. (Hasn't published it yet)

@claudi
Copy link
Contributor Author

claudi commented Jan 17, 2021

Should I fix the problem myself and submit another pull request?

@Shimuuar
Copy link
Contributor

@claudi please don't. Fix is trivial and I'm using this as test case for debugging tool for copying haddocks.

Thanks for contribution!

@lehins
Copy link
Contributor

lehins commented Jan 17, 2021

@Shimuuar Good catch.

This was referenced Jan 17, 2021
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Aug 19, 2022
# Changes in version 0.13.0.0

 * `mkType` from `Data.Vector.Generic` is deprecated in favor of
   `Data.Data.mkNoRepType`
 * The role signatures on several `Vector` types were too permissive, so they
   have been tightened up:
   * The role signature for `Data.Vector.Mutable.MVector` is now
     `type role MVector nominal representational` (previously, both arguments
     were `phantom`). [#224](haskell/vector#224)
   * The role signature for `Data.Vector.Primitive.Vector` is now
     `type role Vector nominal` (previously, it was `phantom`).
     The role signature for `Data.Vector.Primitive.Mutable.MVector` is now
     `type role MVector nominal nominal` (previously, both arguments were
     `phantom`). [#316](haskell/vector#316)
   * The role signature for `Data.Vector.Storable.Vector` is now
     `type role Vector nominal` (previous, it was `phantom`), and the signature
     for `Data.Vector.Storable.Mutable.MVector` is now
     `type role MVector nominal nominal` (previous, both arguments were
     `phantom`). [#235](haskell/vector#235)

     We pick `nominal` for the role of the last argument instead of
     `representational` since the internal structure of a `Storable` vector is
     determined by the `Storable` instance of the element type, and it is not
     guaranteed that the `Storable` instances between two representationally
     equal types will preserve this internal structure.  One consequence of this
     choice is that it is no longer possible to `coerce` between
     `Storable.Vector a` and `Storable.Vector b` if `a` and `b` are nominally
     distinct but representationally equal types. We now provide
     `unsafeCoerce{M}Vector` and `unsafeCast` functions to allow this (the onus
     is on the user to ensure that no `Storable` invariants are broken when
     using these functions).
 * Methods of type classes `Data.Vector.Generic.Mutable.MVector` and
   `Data.Vector.Generic.Vector` use concrete monads (`ST`, etc) istead of being
   polymorphic (`PrimMonad`, etc). [#335](haskell/vector#335).
   This makes it possible to derive `Unbox` with:
   * `GeneralizedNewtypeDeriving`
   * via `UnboxViaPrim` and `Prim` instance
   * via `As` and `IsoUnbox` instance: [#378](haskell/vector#378)
 * Add `MonadFix` instance for boxed vectors: [#312](haskell/vector#312)
 * Re-export `PrimMonad` and `RealWorld` from mutable vectors:
   [#320](haskell/vector#320)
 * Add `maximumOn` and `minimumOn`: [#356](haskell/vector#356)
 * The functions `scanl1`, `scanl1'`, `scanr1`, and `scanr1'` for immutable
   vectors are now defined when given empty vectors as arguments,
   in which case they return empty vectors. This new behavior is consistent
   with the one of the corresponding functions in `Data.List`.
   Prior to this change, applying an empty vector to any of those functions
   resulted in an error. This change was introduced in:
   [#382](haskell/vector#382)
 * Change allocation strategy for `unfoldrN`: [#387](haskell/vector#387)
 * Remove `CPP` driven error reporting in favor of `HasCallStack`:
   [#397](haskell/vector#397)
 * Remove redundant `Storable` constraints on to/from `ForeignPtr` conversions:
   [#394](haskell/vector#394)
 * Add `unsafeCast` to `Primitive` vectors: [#401](haskell/vector#401)
 * Make `(!?)` operator strict: [#402](haskell/vector#402)
 * Add `readMaybe`: [#425](haskell/vector#425)
 * Add `groupBy` and `group` for `Data.Vector.Generic` and the specialized
   version in `Data.Vector`, `Data.Vector.Unboxed`, `Data.Vector.Storable` and
   `Data.Vector.Primitive`. [#427](haskell/vector#427)
 * Add `toArraySlice` and `unsafeFromArraySlice` functions for conversion to and
   from the underlying boxed `Array`: [#434](haskell/vector#434)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants