.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / unist-util-visit-parents / index.js
1 'use strict'
2
3 module.exports = visitParents
4
5 var convert = require('unist-util-is/convert')
6
7 var CONTINUE = true
8 var SKIP = 'skip'
9 var EXIT = false
10
11 visitParents.CONTINUE = CONTINUE
12 visitParents.SKIP = SKIP
13 visitParents.EXIT = EXIT
14
15 function visitParents(tree, test, visitor, reverse) {
16   var is
17
18   if (typeof test === 'function' && typeof visitor !== 'function') {
19     reverse = visitor
20     visitor = test
21     test = null
22   }
23
24   is = convert(test)
25
26   one(tree, null, [])
27
28   // Visit a single node.
29   function one(node, index, parents) {
30     var result = []
31     var subresult
32
33     if (!test || is(node, index, parents[parents.length - 1] || null)) {
34       result = toResult(visitor(node, parents))
35
36       if (result[0] === EXIT) {
37         return result
38       }
39     }
40
41     if (node.children && result[0] !== SKIP) {
42       subresult = toResult(all(node.children, parents.concat(node)))
43       return subresult[0] === EXIT ? subresult : result
44     }
45
46     return result
47   }
48
49   // Visit children in `parent`.
50   function all(children, parents) {
51     var min = -1
52     var step = reverse ? -1 : 1
53     var index = (reverse ? children.length : min) + step
54     var result
55
56     while (index > min && index < children.length) {
57       result = one(children[index], index, parents)
58
59       if (result[0] === EXIT) {
60         return result
61       }
62
63       index = typeof result[1] === 'number' ? result[1] : index + step
64     }
65   }
66 }
67
68 function toResult(value) {
69   if (value !== null && typeof value === 'object' && 'length' in value) {
70     return value
71   }
72
73   if (typeof value === 'number') {
74     return [CONTINUE, value]
75   }
76
77   return [value]
78 }