1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use rnode::{Visit, VisitWith};
use stc_ts_types::Type;

pub struct TypeFinder {
    found: bool,
    check: fn(&Type) -> bool,
}

impl TypeFinder {
    pub fn find<N>(node: &N, check: fn(&Type) -> bool) -> bool
    where
        N: VisitWith<Self>,
    {
        let mut v = TypeFinder { found: false, check };
        node.visit_with(&mut v);
        v.found
    }
}

impl Visit<Type> for TypeFinder {
    fn visit(&mut self, ty: &Type) {
        if self.found {
            return;
        }

        if (self.check)(ty) {
            self.found = true;
            return;
        }

        ty.visit_children_with(self);
    }
}