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

Generic argument support for node methods #383

Merged
merged 9 commits into from Apr 23, 2022
30 changes: 21 additions & 9 deletions src/nodes/Node.ts
Expand Up @@ -7,7 +7,11 @@ import type { Scalar } from './Scalar.js'
import type { YAMLMap } from './YAMLMap.js'
import type { YAMLSeq } from './YAMLSeq.js'

export type Node = Alias | Scalar | YAMLMap | YAMLSeq
export type Node<T = unknown> =
golergka marked this conversation as resolved.
Show resolved Hide resolved
| Alias
| Scalar<T>
| YAMLMap<unknown, T>
| YAMLSeq<T>

export type ParsedNode =
| Alias.Parsed
Expand All @@ -28,22 +32,28 @@ export const NODE_TYPE = Symbol.for('yaml.node.type')
export const isAlias = (node: any): node is Alias =>
!!node && typeof node === 'object' && node[NODE_TYPE] === ALIAS

export const isDocument = (node: any): node is Document =>
export const isDocument = <T = unknown>(node: any): node is Document<T> =>
!!node && typeof node === 'object' && node[NODE_TYPE] === DOC

export const isMap = (node: any): node is YAMLMap =>
export const isMap = <K = unknown, V = unknown>(
node: any
): node is YAMLMap<K, V> =>
!!node && typeof node === 'object' && node[NODE_TYPE] === MAP

export const isPair = (node: any): node is Pair =>
export const isPair = <K = unknown, V = unknown>(
node: any
): node is Pair<K, V> =>
!!node && typeof node === 'object' && node[NODE_TYPE] === PAIR

export const isScalar = (node: any): node is Scalar =>
export const isScalar = <T = unknown>(node: any): node is Scalar<T> =>
!!node && typeof node === 'object' && node[NODE_TYPE] === SCALAR

export const isSeq = (node: any): node is YAMLSeq =>
export const isSeq = <T = unknown>(node: any): node is YAMLSeq<T> =>
!!node && typeof node === 'object' && node[NODE_TYPE] === SEQ

export function isCollection(node: any): node is YAMLMap | YAMLSeq {
export function isCollection<K = unknown, V = unknown>(
node: any
): node is YAMLMap<K, V> | YAMLSeq<V> {
if (node && typeof node === 'object')
switch (node[NODE_TYPE]) {
case MAP:
Expand All @@ -53,7 +63,7 @@ export function isCollection(node: any): node is YAMLMap | YAMLSeq {
return false
}

export function isNode(node: any): node is Node {
export function isNode<T = unknown>(node: any): node is Node<T> {
if (node && typeof node === 'object')
switch (node[NODE_TYPE]) {
case ALIAS:
Expand All @@ -65,7 +75,9 @@ export function isNode(node: any): node is Node {
return false
}

export const hasAnchor = (node: unknown): node is Scalar | YAMLMap | YAMLSeq =>
export const hasAnchor = <K = unknown, V = unknown>(
node: unknown
): node is Scalar<V> | YAMLMap<K, V> | YAMLSeq<V> =>
(isScalar(node) || isCollection(node)) && !!node.anchor

export abstract class NodeBase {
Expand Down