1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
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.AbstractExpression;
13  import dev.metaschema.core.metapath.cst.IExpressionVisitor;
14  import dev.metaschema.core.metapath.item.ISequence;
15  import dev.metaschema.core.metapath.item.function.IArrayItem;
16  import edu.umd.cs.findbugs.annotations.NonNull;
17  
18  /**
19   * An implementation of the
20   * <a href="https://www.w3.org/TR/xpath-31/#id-array-constructors">Array Square
21   * Constructor</a> supporting the creation of a Metapath {@link IArrayItem}.
22   */
23  public class ArraySquareConstructor
24      extends AbstractExpression {
25    @NonNull
26    private final List<IExpression> children;
27  
28    /**
29     * Construct a new array constructor expression that uses the provided
30     * expression to initialize the array.
31     * <p>
32     * Each resulting array member contains the value of the corresponding argument
33     * expression.
34     *
35     * @param text
36     *          the parsed text of the expression
37     * @param children
38     *          the expressions used to produce the array members
39     */
40    public ArraySquareConstructor(@NonNull String text, @NonNull List<IExpression> children) {
41      super(text);
42      this.children = children;
43    }
44  
45    @Override
46    public List<? extends IExpression> getChildren() {
47      return children;
48    }
49  
50    @Override
51    protected ISequence<IArrayItem<?>> evaluate(DynamicContext dynamicContext, ISequence<?> focus) {
52      return ISequence.of(getChildren().stream()
53          .map(expr -> expr.accept(dynamicContext, focus))
54          .map(ISequence::toCollectionValue)
55          .collect(IArrayItem.toArrayItem()));
56    }
57  
58    @Override
59    public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
60      return visitor.visitArray(this, context);
61    }
62  }