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

Configure Feed

Select the types of activity you want to include in your feed.

Inline visitor getters (#17)

* Inline visitor getters

* Reformat visitInParallel

authored by

Phil Pluckthun and committed by
GitHub
bc36916b c1f83deb

+50 -41
+50 -41
alias/language/visitor.mjs
··· 1 1 import { BREAK, Kind } from '@0no-co/graphql.web'; 2 - import { getEnterLeaveForKind } from 'graphql/language/visitor'; 2 + export { BREAK, visit, Kind } from '@0no-co/graphql.web'; 3 + 4 + export function getEnterLeaveForKind(visitor, kind) { 5 + if (typeof visitor[kind] === 'object') { 6 + return visitor[kind]; 7 + } 8 + return { 9 + enter: visitor[kind] || visitor.enter, 10 + leave: visitor.leave, 11 + }; 12 + } 3 13 4 - export { getEnterLeaveForKind, getVisitFn } from 'graphql/language/visitor'; 5 - export { BREAK, visit, Kind } from '@0no-co/graphql.web'; 14 + export function getVisitFn(visitor, kind, isLeaving) { 15 + const { enter, leave } = getEnterLeaveForKind(visitor, kind); 16 + return isLeaving ? leave : enter; 17 + } 6 18 7 19 export function visitInParallel(visitors) { 8 20 const skipping = new Array(visitors.length).fill(null); 9 - const mergedVisitor = Object.create(null); 21 + const mergedVisitor = {}; 10 22 11 - for (const kind of Object.values(Kind)) { 23 + for (const kindName in Kind) { 24 + const kind = Kind[kindName]; 12 25 let hasVisitor = false; 13 - const enterList = new Array(visitors.length).fill(undefined); 14 - const leaveList = new Array(visitors.length).fill(undefined); 26 + const enterList = new Array(visitors.length).fill(); 27 + const leaveList = new Array(visitors.length).fill(); 15 28 16 29 for (let i = 0; i < visitors.length; ++i) { 17 30 const { enter, leave } = getEnterLeaveForKind(visitors[i], kind); ··· 20 33 leaveList[i] = leave; 21 34 } 22 35 23 - if (!hasVisitor) { 24 - continue; 25 - } 26 - 27 - const mergedEnterLeave = { 28 - enter(...args) { 29 - const node = args[0]; 30 - for (let i = 0; i < visitors.length; i++) { 31 - if (skipping[i] === null) { 32 - const result = enterList[i] && enterList[i].apply(visitors[i], args); 33 - if (result === false) { 34 - skipping[i] = node; 35 - } else if (result === BREAK) { 36 - skipping[i] = BREAK; 37 - } else if (result !== undefined) { 38 - return result; 36 + if (hasVisitor) { 37 + mergedVisitor[kind] = { 38 + enter(...args) { 39 + const node = args[0]; 40 + for (let i = 0; i < visitors.length; i++) { 41 + if (!skipping[i]) { 42 + const result = enterList[i] && enterList[i].apply(visitors[i], args); 43 + if (result === false) { 44 + skipping[i] = node; 45 + } else if (result === BREAK) { 46 + skipping[i] = BREAK; 47 + } else if (result !== undefined) { 48 + return result; 49 + } 39 50 } 40 51 } 41 - } 42 - }, 43 - leave(...args) { 44 - const node = args[0]; 45 - for (let i = 0; i < visitors.length; i++) { 46 - if (skipping[i] === null) { 47 - const result = leaveList[i] && leaveList[i].apply(visitors[i], args); 48 - if (result === BREAK) { 49 - skipping[i] = BREAK; 50 - } else if (result !== undefined && result !== false) { 51 - return result; 52 + }, 53 + leave(...args) { 54 + const node = args[0]; 55 + for (let i = 0; i < visitors.length; i++) { 56 + if (!skipping[i]) { 57 + const result = leaveList[i] && leaveList[i].apply(visitors[i], args); 58 + if (result === BREAK) { 59 + skipping[i] = BREAK; 60 + } else if (result !== undefined && result !== false) { 61 + return result; 62 + } 63 + } else if (skipping[i] === node) { 64 + skipping[i] = null; 52 65 } 53 - } else if (skipping[i] === node) { 54 - skipping[i] = null; 55 66 } 56 - } 57 - }, 58 - }; 59 - 60 - mergedVisitor[kind] = mergedEnterLeave; 67 + }, 68 + }; 69 + } 61 70 } 62 71 63 72 return mergedVisitor;