Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions src/immutable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/** Imported from Immer to avoid having an implicit dependency in this patch */
type PrimitiveType = number | string | boolean
type AtomicObject = Function | Promise<any> | Date | RegExp
export type IfAvailable<T, Fallback = void> =
// fallback if any
true | false extends (T extends never ? true : false)
? Fallback // fallback if empty type
: keyof T extends never
? Fallback // original type
: T
type WeakReferences = IfAvailable<WeakMap<any, any>> | IfAvailable<WeakSet<any>>
export type WritableDraft<T> = { -readonly [K in keyof T]: Draft<T[K]> }
export type Draft<T> = T extends PrimitiveType
? T
: T extends AtomicObject
? T
: T extends IfAvailable<ReadonlyMap<infer K, infer V>> // Map extends ReadonlyMap
? Map<Draft<K>, Draft<V>>
: T extends IfAvailable<ReadonlySet<infer V>> // Set extends ReadonlySet
? Set<Draft<V>>
: T extends WeakReferences
? T
: T extends object
? WritableDraft<T>
: T
export type Immutable<T> = T extends PrimitiveType
? T
: T extends AtomicObject
? T
: T extends IfAvailable<ReadonlyMap<infer K, infer V>> // Map extends ReadonlyMap
? ReadonlyMap<Immutable<K>, Immutable<V>>
: T extends IfAvailable<ReadonlySet<infer V>> // Set extends ReadonlySet
? ReadonlySet<Immutable<V>>
: T extends WeakReferences
? T
: T extends object
? { readonly [K in keyof T]: Immutable<T[K]> }
: T
15 changes: 8 additions & 7 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import type {
Expand,
ObjValueTuple,
Head,
Tail
Tail,
Immutable
} from './types'

export type {
Expand Down Expand Up @@ -171,11 +172,11 @@ export interface CreateSelectorFunction<
<Selectors extends SelectorArray, Result>(
...items: [
...Selectors,
(...args: SelectorResultArray<Selectors>) => Result
(...args: SelectorResultArray<Selectors>) => Immutable<Result>
]
): OutputSelector<
Selectors,
Result,
Immutable<Result>,
(...args: SelectorResultArray<Selectors>) => Result,
GetParamsFromSelectors<Selectors>,
Keys
Expand All @@ -191,8 +192,8 @@ export interface CreateSelectorFunction<
]
): OutputSelector<
Selectors,
Result,
((...args: SelectorResultArray<Selectors>) => Result),
Immutable<Result>,
(...args: SelectorResultArray<Selectors>) => Result,
GetParamsFromSelectors<Selectors>,
Keys
> &
Expand All @@ -201,11 +202,11 @@ export interface CreateSelectorFunction<
/** Input selectors as a separate array */
<Selectors extends SelectorArray, Result>(
selectors: [...Selectors],
combiner: (...args: SelectorResultArray<Selectors>) => Result,
combiner: (...args: SelectorResultArray<Selectors>) => Immutable<Result>,
options?: CreateSelectorOptions<MemoizeOptions>
): OutputSelector<
Selectors,
Result,
Immutable<Result>,
(...args: SelectorResultArray<Selectors>) => Result,
GetParamsFromSelectors<Selectors>,
Keys
Expand Down
1 change: 1 addition & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { MergeParameters } from './versionedTypes'
export type { MergeParameters } from './versionedTypes'
export type { Immutable } from './immutable'

/*
*
Expand Down