1
2
3
4
5
6 package dev.metaschema.core.metapath.cst.items;
7
8 import java.util.List;
9
10 import dev.metaschema.core.metapath.DynamicContext;
11 import dev.metaschema.core.metapath.IExpression;
12 import dev.metaschema.core.metapath.cst.AbstractNAryExpression;
13 import dev.metaschema.core.metapath.cst.IExpressionVisitor;
14 import dev.metaschema.core.metapath.function.library.FnConcat;
15 import dev.metaschema.core.metapath.item.ISequence;
16 import dev.metaschema.core.metapath.item.atomic.IStringItem;
17 import dev.metaschema.core.util.ObjectUtils;
18 import edu.umd.cs.findbugs.annotations.NonNull;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 public class StringConcat
39 extends AbstractNAryExpression {
40
41
42
43
44
45
46
47
48
49
50 public StringConcat(@NonNull String text, @NonNull List<IExpression> expressions) {
51 super(text, expressions);
52 }
53
54 @Override
55 public Class<IStringItem> getBaseResultType() {
56 return IStringItem.class;
57 }
58
59 @Override
60 public Class<IStringItem> getStaticResultType() {
61 return getBaseResultType();
62 }
63
64 @Override
65 public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
66 return visitor.visitStringConcat(this, context);
67 }
68
69 @Override
70 protected ISequence<?> evaluate(DynamicContext dynamicContext, ISequence<?> focus) {
71 return ISequence.of(FnConcat.concat(ObjectUtils.notNull(getChildren().stream()
72 .map(child -> child.accept(dynamicContext, focus))
73 .flatMap(result -> ObjectUtils.notNull(result).atomize()))));
74 }
75 }