1 | import { Element, StringElement, NumberElement, NullElement, BooleanElement, ArrayElement, ObjectElement, MemberElement, LinkElement, RefElement } from 'minim';
|
---|
2 | import { all } from 'ramda';
|
---|
3 | import { included } from 'ramda-adjunct';
|
---|
4 | import AnnotationElement from "../elements/Annotation.mjs";
|
---|
5 | import CommentElement from "../elements/Comment.mjs";
|
---|
6 | import ParserResultElement from "../elements/ParseResult.mjs";
|
---|
7 | import SourceMapElement from "../elements/SourceMap.mjs";
|
---|
8 | import createPredicate, { isElementType as isElementTypeHelper } from "./helpers.mjs";
|
---|
9 | export const isElement = createPredicate(({
|
---|
10 | hasBasicElementProps,
|
---|
11 | primitiveEq
|
---|
12 | }) => {
|
---|
13 | return element => element instanceof Element || hasBasicElementProps(element) && primitiveEq(undefined, element);
|
---|
14 | });
|
---|
15 | export const isStringElement = createPredicate(({
|
---|
16 | hasBasicElementProps,
|
---|
17 | primitiveEq
|
---|
18 | }) => {
|
---|
19 | return element => element instanceof StringElement || hasBasicElementProps(element) && primitiveEq('string', element);
|
---|
20 | });
|
---|
21 | export const isNumberElement = createPredicate(({
|
---|
22 | hasBasicElementProps,
|
---|
23 | primitiveEq
|
---|
24 | }) => {
|
---|
25 | return element => element instanceof NumberElement || hasBasicElementProps(element) && primitiveEq('number', element);
|
---|
26 | });
|
---|
27 | export const isNullElement = createPredicate(({
|
---|
28 | hasBasicElementProps,
|
---|
29 | primitiveEq
|
---|
30 | }) => {
|
---|
31 | return element => element instanceof NullElement || hasBasicElementProps(element) && primitiveEq('null', element);
|
---|
32 | });
|
---|
33 | export const isBooleanElement = createPredicate(({
|
---|
34 | hasBasicElementProps,
|
---|
35 | primitiveEq
|
---|
36 | }) => {
|
---|
37 | return element => element instanceof BooleanElement || hasBasicElementProps(element) && primitiveEq('boolean', element);
|
---|
38 | });
|
---|
39 | export const isObjectElement = createPredicate(({
|
---|
40 | hasBasicElementProps,
|
---|
41 | primitiveEq,
|
---|
42 | hasMethod
|
---|
43 | }) => {
|
---|
44 | return element => element instanceof ObjectElement || hasBasicElementProps(element) && primitiveEq('object', element) && hasMethod('keys', element) && hasMethod('values', element) && hasMethod('items', element);
|
---|
45 | });
|
---|
46 | export const isArrayElement = createPredicate(({
|
---|
47 | hasBasicElementProps,
|
---|
48 | primitiveEq,
|
---|
49 | hasMethod
|
---|
50 | }) => {
|
---|
51 | return element => element instanceof ArrayElement && !(element instanceof ObjectElement) || hasBasicElementProps(element) && primitiveEq('array', element) && hasMethod('push', element) && hasMethod('unshift', element) && hasMethod('map', element) && hasMethod('reduce', element);
|
---|
52 | });
|
---|
53 | export const isMemberElement = createPredicate(({
|
---|
54 | hasBasicElementProps,
|
---|
55 | isElementType,
|
---|
56 | primitiveEq
|
---|
57 | }) => {
|
---|
58 | return element => element instanceof MemberElement || hasBasicElementProps(element) && isElementType('member', element) && primitiveEq(undefined, element);
|
---|
59 | });
|
---|
60 | export const isLinkElement = createPredicate(({
|
---|
61 | hasBasicElementProps,
|
---|
62 | isElementType,
|
---|
63 | primitiveEq
|
---|
64 | }) => {
|
---|
65 | return element => element instanceof LinkElement || hasBasicElementProps(element) && isElementType('link', element) && primitiveEq(undefined, element);
|
---|
66 | });
|
---|
67 | export const isRefElement = createPredicate(({
|
---|
68 | hasBasicElementProps,
|
---|
69 | isElementType,
|
---|
70 | primitiveEq
|
---|
71 | }) => {
|
---|
72 | return element => element instanceof RefElement || hasBasicElementProps(element) && isElementType('ref', element) && primitiveEq(undefined, element);
|
---|
73 | });
|
---|
74 | export const isAnnotationElement = createPredicate(({
|
---|
75 | hasBasicElementProps,
|
---|
76 | isElementType,
|
---|
77 | primitiveEq
|
---|
78 | }) => {
|
---|
79 | return element => element instanceof AnnotationElement || hasBasicElementProps(element) && isElementType('annotation', element) && primitiveEq('array', element);
|
---|
80 | });
|
---|
81 | export const isCommentElement = createPredicate(({
|
---|
82 | hasBasicElementProps,
|
---|
83 | isElementType,
|
---|
84 | primitiveEq
|
---|
85 | }) => {
|
---|
86 | return element => element instanceof CommentElement || hasBasicElementProps(element) && isElementType('comment', element) && primitiveEq('string', element);
|
---|
87 | });
|
---|
88 | export const isParseResultElement = createPredicate(({
|
---|
89 | hasBasicElementProps,
|
---|
90 | isElementType,
|
---|
91 | primitiveEq
|
---|
92 | }) => {
|
---|
93 | return element => element instanceof ParserResultElement || hasBasicElementProps(element) && isElementType('parseResult', element) && primitiveEq('array', element);
|
---|
94 | });
|
---|
95 | export const isSourceMapElement = createPredicate(({
|
---|
96 | hasBasicElementProps,
|
---|
97 | isElementType,
|
---|
98 | primitiveEq
|
---|
99 | }) => {
|
---|
100 | return element => element instanceof SourceMapElement || hasBasicElementProps(element) && isElementType('sourceMap', element) && primitiveEq('array', element);
|
---|
101 | });
|
---|
102 | export const isPrimitiveElement = element => {
|
---|
103 | return isElementTypeHelper('object', element) || isElementTypeHelper('array', element) || isElementTypeHelper('boolean', element) || isElementTypeHelper('number', element) || isElementTypeHelper('string', element) || isElementTypeHelper('null', element) || isElementTypeHelper('member', element);
|
---|
104 | };
|
---|
105 | export const hasElementSourceMap = element => {
|
---|
106 | return isSourceMapElement(element.meta.get('sourceMap'));
|
---|
107 | };
|
---|
108 | export const includesSymbols = (symbols, element) => {
|
---|
109 | if (symbols.length === 0) {
|
---|
110 | return true;
|
---|
111 | }
|
---|
112 | const elementSymbols = element.attributes.get('symbols');
|
---|
113 | if (!isArrayElement(elementSymbols)) {
|
---|
114 | return false;
|
---|
115 | }
|
---|
116 | return all(included(elementSymbols.toValue()), symbols);
|
---|
117 | };
|
---|
118 | export const includesClasses = (classes, element) => {
|
---|
119 | if (classes.length === 0) {
|
---|
120 | return true;
|
---|
121 | }
|
---|
122 | return all(included(element.classes.toValue()), classes);
|
---|
123 | }; |
---|