Skip to content

Commit

Permalink
Ensure Chunk.reverse preserves NonEmpty status, closes #2947 (#2950)
Browse files Browse the repository at this point in the history
  • Loading branch information
gcanti authored Jun 7, 2024
1 parent 3a77e20 commit 184fed8
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 5 deletions.
5 changes: 5 additions & 0 deletions .changeset/cold-kangaroos-chew.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"effect": patch
---

Ensure `Chunk.reverse` preserves `NonEmpty` status, closes #2947
16 changes: 16 additions & 0 deletions packages/effect/dtslint/Chunk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -471,3 +471,19 @@ flattenNonEmptyChunk.pipe(Effect.map((_) => Chunk.flatten(_)))

// $ExpectType Effect<NonEmptyChunk<number>, never, never>
flattenNonEmptyChunk.pipe(Effect.map(Chunk.flatten))

// -------------------------------------------------------------------------------------
// reverse
// -------------------------------------------------------------------------------------

// $ExpectType Chunk<number>
Chunk.reverse(numbers)

// $ExpectType Chunk<number>
pipe(numbers, Chunk.reverse)

// $ExpectType NonEmptyChunk<number>
Chunk.reverse(nonEmptyNumbers)

// $ExpectType NonEmptyChunk<number>
pipe(nonEmptyNumbers, Chunk.reverse)
22 changes: 17 additions & 5 deletions packages/effect/src/Chunk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -316,11 +316,7 @@ export const toReadonlyArray = <A>(self: Chunk<A>): ReadonlyArray<A> => {
}
}

/**
* @since 2.0.0
* @category elements
*/
export const reverse = <A>(self: Chunk<A>): Chunk<A> => {
const reverseChunk = <A>(self: Chunk<A>): Chunk<A> => {
switch (self.backing._tag) {
case "IEmpty":
case "ISingleton":
Expand All @@ -336,6 +332,22 @@ export const reverse = <A>(self: Chunk<A>): Chunk<A> => {
}
}

/**
* Reverses the order of elements in a `Chunk`.
* Importantly, if the input chunk is a `NonEmptyChunk`, the reversed chunk will also be a `NonEmptyChunk`.
*
* @example
* import { Chunk } from "effect"
*
* const numbers = Chunk.make(1, 2, 3)
* const reversedNumbers = Chunk.reverse(numbers)
* assert.deepStrictEqual(reversedNumbers, Chunk.make(3, 2, 1))
*
* @since 2.0.0
* @category elements
*/
export const reverse: <S extends Chunk<any>>(self: S) => Chunk.With<S, Chunk.Infer<S>> = reverseChunk as any

/**
* This function provides a safe way to read a value at a particular index from a `Chunk`.
*
Expand Down

0 comments on commit 184fed8

Please sign in to comment.