Skip to content

Commit

Permalink
fix the tacit use of flatten (#1724)
Browse files Browse the repository at this point in the history
  • Loading branch information
gcanti authored Dec 1, 2023
1 parent f0c9cf0 commit 1884fa3
Show file tree
Hide file tree
Showing 9 changed files with 100 additions and 17 deletions.
5 changes: 5 additions & 0 deletions .changeset/eight-taxis-remain.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"effect": patch
---

Chunk: fix the tacit use of flatten
5 changes: 5 additions & 0 deletions .changeset/sweet-rings-play.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"effect": patch
---

ReadonlyArray: fix the tacit use of flatten
20 changes: 16 additions & 4 deletions docs/modules/Chunk.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ Added in v2.0.0
- [unsafeLast](#unsafelast)
- [utils](#utils)
- [Chunk (namespace)](#chunk-namespace)
- [Flatten (type alias)](#flatten-type-alias)
- [Infer (type alias)](#infer-type-alias)
- [With (type alias)](#with-type-alias)
- [With2 (type alias)](#with2-type-alias)
Expand Down Expand Up @@ -1047,10 +1048,7 @@ Flattens a chunk of chunks into a single chunk by concatenating all chunks.
**Signature**
```ts
export declare const flatten: {
<A>(self: NonEmptyChunk<NonEmptyChunk<A>>): NonEmptyChunk<A>
<A>(self: Chunk<Chunk<A>>): Chunk<A>
}
export declare const flatten: <T extends Chunk<Chunk<any>>>(self: T) => Chunk.Flatten<T>
```
Added in v2.0.0
Expand Down Expand Up @@ -1149,6 +1147,20 @@ Added in v2.0.0
Added in v2.0.0
### Flatten (type alias)
**Signature**
```ts
export type Flatten<T extends Chunk<Chunk<any>>> = T extends NonEmptyChunk<NonEmptyChunk<infer A>>
? NonEmptyChunk<A>
: T extends Chunk<Chunk<infer A>>
? Chunk<A>
: never
```
Added in v2.0.0
### Infer (type alias)
**Signature**
Expand Down
22 changes: 18 additions & 4 deletions docs/modules/ReadonlyArray.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ Added in v2.0.0
- [unsafeGet](#unsafeget)
- [utils](#utils)
- [ReadonlyArray (namespace)](#readonlyarray-namespace)
- [Flatten (type alias)](#flatten-type-alias)
- [Infer (type alias)](#infer-type-alias)
- [With (type alias)](#with-type-alias)
- [With2 (type alias)](#with2-type-alias)
Expand Down Expand Up @@ -1496,10 +1497,7 @@ Flattens an array of arrays into a single array by concatenating all arrays.
**Signature**
```ts
export declare const flatten: {
<A>(self: readonly [readonly [A, ...A[]], ...(readonly [A, ...A[]])[]]): [A, ...A[]]
<A>(self: readonly (readonly A[])[]): A[]
}
export declare const flatten: <T extends readonly (readonly any[])[]>(self: T) => ReadonlyArray.Flatten<T>
```
Added in v2.0.0
Expand Down Expand Up @@ -1578,6 +1576,22 @@ Added in v2.0.0
Added in v2.0.0
### Flatten (type alias)
**Signature**
```ts
export type Flatten<T extends ReadonlyArray<ReadonlyArray<any>>> = T extends NonEmptyReadonlyArray<
NonEmptyReadonlyArray<infer A>
>
? NonEmptyArray<A>
: T extends ReadonlyArray<ReadonlyArray<infer A>>
? Array<A>
: never
```
Added in v2.0.0
### Infer (type alias)
**Signature**
Expand Down
16 changes: 16 additions & 0 deletions dtslint/Chunk.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as Chunk from "effect/Chunk"
import * as Effect from "effect/Effect"
import { hole, pipe } from "effect/Function"
import * as Predicate from "effect/Predicate"

Expand Down Expand Up @@ -398,3 +399,18 @@ Chunk.flatten(hole<Chunk.NonEmptyChunk<Chunk.Chunk<number>>>())

// $ExpectType NonEmptyChunk<number>
Chunk.flatten(hole<Chunk.NonEmptyChunk<Chunk.NonEmptyChunk<number>>>())

declare const flattenChunk: Effect.Effect<never, never, Chunk.Chunk<Chunk.Chunk<number>>>
declare const flattenNonEmptyChunk: Effect.Effect<never, never, Chunk.NonEmptyChunk<Chunk.NonEmptyChunk<number>>>

// $ExpectType Effect<never, never, Chunk<number>>
flattenChunk.pipe(Effect.map((_) => Chunk.flatten(_)))

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

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

// $ExpectType Effect<never, never, NonEmptyChunk<number>>
flattenNonEmptyChunk.pipe(Effect.map(Chunk.flatten))
20 changes: 20 additions & 0 deletions dtslint/ReadonlyArray.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import * as Effect from "effect/Effect"
import * as Equal from "effect/Equal"
import { hole, pipe } from "effect/Function"
import * as Option from "effect/Option"
Expand Down Expand Up @@ -462,6 +463,25 @@ ReadonlyArray.flatten(hole<ReadonlyArray.NonEmptyArray<Array<number>>>())
// $ExpectType [number, ...number[]]
ReadonlyArray.flatten(hole<ReadonlyArray.NonEmptyReadonlyArray<ReadonlyArray.NonEmptyReadonlyArray<number>>>())

declare const flattenArray: Effect.Effect<never, never, ReadonlyArray<ReadonlyArray<number>>>
declare const flattenNonEmptyArray: Effect.Effect<
never,
never,
ReadonlyArray.NonEmptyReadonlyArray<ReadonlyArray.NonEmptyReadonlyArray<number>>
>

// $ExpectType Effect<never, never, number[]>
flattenArray.pipe(Effect.map((_) => ReadonlyArray.flatten(_)))

// $ExpectType Effect<never, never, number[]>
flattenArray.pipe(Effect.map(ReadonlyArray.flatten))

// $ExpectType Effect<never, never, [number, ...number[]]>
flattenNonEmptyArray.pipe(Effect.map((_) => ReadonlyArray.flatten(_)))

// $ExpectType Effect<never, never, [number, ...number[]]>
flattenNonEmptyArray.pipe(Effect.map(ReadonlyArray.flatten))

// -------------------------------------------------------------------------------------
// prependAll
// -------------------------------------------------------------------------------------
Expand Down
12 changes: 8 additions & 4 deletions src/Chunk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -720,10 +720,7 @@ export const forEach: {
* @since 2.0.0
* @category sequencing
*/
export const flatten: {
<A>(self: NonEmptyChunk<NonEmptyChunk<A>>): NonEmptyChunk<A>
<A>(self: Chunk<Chunk<A>>): Chunk<A>
} = flatMap(identity) as any
export const flatten: <T extends Chunk<Chunk<any>>>(self: T) => Chunk.Flatten<T> = flatMap(identity) as any

/**
* Groups elements in chunks of up to `n` elements.
Expand Down Expand Up @@ -843,6 +840,13 @@ export declare namespace Chunk {
export type With2<S extends Chunk<any>, T extends Chunk<any>, A> = S extends NonEmptyChunk<any> ? NonEmptyChunk<A>
: T extends NonEmptyChunk<any> ? NonEmptyChunk<A>
: Chunk<A>

/**
* @since 2.0.0
*/
export type Flatten<T extends Chunk<Chunk<any>>> = T extends NonEmptyChunk<NonEmptyChunk<infer A>> ? NonEmptyChunk<A>
: T extends Chunk<Chunk<infer A>> ? Chunk<A>
: never
}

/**
Expand Down
15 changes: 11 additions & 4 deletions src/ReadonlyArray.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1417,6 +1417,14 @@ export declare namespace ReadonlyArray {
S extends NonEmptyReadonlyArray<any> ? NonEmptyArray<A>
: T extends NonEmptyReadonlyArray<any> ? NonEmptyArray<A>
: Array<A>

/**
* @since 2.0.0
*/
export type Flatten<T extends ReadonlyArray<ReadonlyArray<any>>> = T extends
NonEmptyReadonlyArray<NonEmptyReadonlyArray<infer A>> ? NonEmptyArray<A>
: T extends ReadonlyArray<ReadonlyArray<infer A>> ? Array<A>
: never
}

/**
Expand Down Expand Up @@ -1462,10 +1470,9 @@ export const flatMap: {
* @category sequencing
* @since 2.0.0
*/
export const flatten: {
<A>(self: NonEmptyReadonlyArray<NonEmptyReadonlyArray<A>>): NonEmptyArray<A>
<A>(self: ReadonlyArray<ReadonlyArray<A>>): Array<A>
} = flatMap(identity) as any
export const flatten: <T extends ReadonlyArray<ReadonlyArray<any>>>(self: T) => ReadonlyArray.Flatten<T> = flatMap(
identity
) as any

/**
* @category filtering
Expand Down
2 changes: 1 addition & 1 deletion src/internal/fiberRuntime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3081,7 +3081,7 @@ export const fiberAll = <E, A>(fibers: Iterable<Fiber.Fiber<E, A>>): Fiber.Fiber
[internalFiber.FiberTypeId]: internalFiber.fiberVariance,
id: () => RA.fromIterable(fibers).reduce((id, fiber) => FiberId.combine(id, fiber.id()), FiberId.none),
await: core.exit(forEachParUnbounded(fibers, (fiber) => core.flatten(fiber.await), false)),
children: core.map(forEachParUnbounded(fibers, (fiber) => fiber.children, false), (children) => RA.flatten(children)),
children: core.map(forEachParUnbounded(fibers, (fiber) => fiber.children, false), RA.flatten),
inheritAll: core.forEachSequentialDiscard(fibers, (fiber) => fiber.inheritAll),
poll: core.map(
core.forEachSequential(fibers, (fiber) => fiber.poll),
Expand Down

0 comments on commit 1884fa3

Please sign in to comment.