Mirror: The small sibling of the graphql package, slimmed down for client-side libraries.

Inline visitor getters (#17)

* Inline visitor getters

* Reformat visitInParallel

Changed files
+50 -41
alias
language
+50 -41
alias/language/visitor.mjs
···
import { BREAK, Kind } from '@0no-co/graphql.web';
-
import { getEnterLeaveForKind } from 'graphql/language/visitor';
+
export { BREAK, visit, Kind } from '@0no-co/graphql.web';
+
+
export function getEnterLeaveForKind(visitor, kind) {
+
if (typeof visitor[kind] === 'object') {
+
return visitor[kind];
+
}
+
return {
+
enter: visitor[kind] || visitor.enter,
+
leave: visitor.leave,
+
};
+
}
-
export { getEnterLeaveForKind, getVisitFn } from 'graphql/language/visitor';
-
export { BREAK, visit, Kind } from '@0no-co/graphql.web';
+
export function getVisitFn(visitor, kind, isLeaving) {
+
const { enter, leave } = getEnterLeaveForKind(visitor, kind);
+
return isLeaving ? leave : enter;
+
}
export function visitInParallel(visitors) {
const skipping = new Array(visitors.length).fill(null);
-
const mergedVisitor = Object.create(null);
+
const mergedVisitor = {};
-
for (const kind of Object.values(Kind)) {
+
for (const kindName in Kind) {
+
const kind = Kind[kindName];
let hasVisitor = false;
-
const enterList = new Array(visitors.length).fill(undefined);
-
const leaveList = new Array(visitors.length).fill(undefined);
+
const enterList = new Array(visitors.length).fill();
+
const leaveList = new Array(visitors.length).fill();
for (let i = 0; i < visitors.length; ++i) {
const { enter, leave } = getEnterLeaveForKind(visitors[i], kind);
···
leaveList[i] = leave;
}
-
if (!hasVisitor) {
-
continue;
-
}
-
-
const mergedEnterLeave = {
-
enter(...args) {
-
const node = args[0];
-
for (let i = 0; i < visitors.length; i++) {
-
if (skipping[i] === null) {
-
const result = enterList[i] && enterList[i].apply(visitors[i], args);
-
if (result === false) {
-
skipping[i] = node;
-
} else if (result === BREAK) {
-
skipping[i] = BREAK;
-
} else if (result !== undefined) {
-
return result;
+
if (hasVisitor) {
+
mergedVisitor[kind] = {
+
enter(...args) {
+
const node = args[0];
+
for (let i = 0; i < visitors.length; i++) {
+
if (!skipping[i]) {
+
const result = enterList[i] && enterList[i].apply(visitors[i], args);
+
if (result === false) {
+
skipping[i] = node;
+
} else if (result === BREAK) {
+
skipping[i] = BREAK;
+
} else if (result !== undefined) {
+
return result;
+
}
}
}
-
}
-
},
-
leave(...args) {
-
const node = args[0];
-
for (let i = 0; i < visitors.length; i++) {
-
if (skipping[i] === null) {
-
const result = leaveList[i] && leaveList[i].apply(visitors[i], args);
-
if (result === BREAK) {
-
skipping[i] = BREAK;
-
} else if (result !== undefined && result !== false) {
-
return result;
+
},
+
leave(...args) {
+
const node = args[0];
+
for (let i = 0; i < visitors.length; i++) {
+
if (!skipping[i]) {
+
const result = leaveList[i] && leaveList[i].apply(visitors[i], args);
+
if (result === BREAK) {
+
skipping[i] = BREAK;
+
} else if (result !== undefined && result !== false) {
+
return result;
+
}
+
} else if (skipping[i] === node) {
+
skipping[i] = null;
}
-
} else if (skipping[i] === node) {
-
skipping[i] = null;
}
-
}
-
},
-
};
-
-
mergedVisitor[kind] = mergedEnterLeave;
+
},
+
};
+
}
}
return mergedVisitor;