package com.bernard.murder; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; import com.amihaiemil.eoyaml.Node; import com.amihaiemil.eoyaml.Yaml; import com.amihaiemil.eoyaml.YamlMapping; import com.amihaiemil.eoyaml.YamlMappingBuilder; import com.amihaiemil.eoyaml.YamlNode; import com.amihaiemil.eoyaml.YamlSequence; import com.amihaiemil.eoyaml.YamlSequenceBuilder; public class YamlUtils { public static final Function compose(Function f,Function g) { return f.compose(g); } public static final YamlSequence listToSeq(List nodes) { YamlSequenceBuilder ysb = Yaml.createYamlSequenceBuilder(); for(YamlNode n : nodes) ysb = ysb.add(n); return ysb.build(); } public static final YamlSequence listToSeqString(List nodes) { YamlSequenceBuilder ysb = Yaml.createYamlSequenceBuilder(); for(String n : nodes) ysb = ysb.add(n); return ysb.build(); } public static final YamlMapping mapToMapping(Map nodes) { YamlMappingBuilder ysb = Yaml.createYamlMappingBuilder(); for(Entry n : nodes.entrySet()) ysb = ysb.add(n.getKey(),n.getValue()); return ysb.build(); } public static final YamlMapping mapToMapping(Map map,Function fKey,Function fVal) { YamlMappingBuilder ysb = Yaml.createYamlMappingBuilder(); for(Entry e : map.entrySet()) ysb.add(fKey.apply(e.getKey()), fVal.apply(e.getValue())); return ysb.build(); } public static final YamlSequence getSequence(YamlNode node) { if(node.type()==Node.SEQUENCE)return node.asSequence(); if(node.type()==Node.SCALAR && node.asScalar().value().contentEquals("[]"))return Yaml.createYamlSequenceBuilder().build(); throw new IllegalArgumentException("Le noeud n'est pas une séquence"); } public static final YamlMapping getMapping(YamlNode node) { if(node.type()==Node.MAPPING)return node.asMapping(); if(node.type()==Node.SCALAR && node.asScalar().value().contentEquals("{}"))return Yaml.createYamlMappingBuilder().build(); throw new IllegalArgumentException("Le noeud n'est pas une séquence"); } public static final boolean isMapping(YamlNode node) { return (node.type()==Node.MAPPING) || (node.type()==Node.SCALAR && node.asScalar().value().contentEquals("{}")); } public static final boolean isSequence(YamlNode node) { return (node.type()==Node.SEQUENCE) || (node.type()==Node.SCALAR && node.asScalar().value().contentEquals("[]")); } public static final YamlNode scalar(Object in) { return Yaml.createYamlScalarBuilder().addLine(in.toString()).buildPlainScalar(); } public static final YamlNode foldedScalar(String in) { return Yaml.createYamlScalarBuilder().addLine(in).buildFoldedBlockScalar(); } public static final YamlSequenceBuilder seqMerge(YamlSequenceBuilder ysba,YamlSequenceBuilder ysbb) { for(YamlNode na : ysba.build().values()) ysbb = ysbb.add(na); return ysbb; } public static final CollectorImpl sequenceCollector = new CollectorImpl<>( Yaml::createYamlSequenceBuilder, YamlSequenceBuilder::add, YamlUtils::seqMerge, YamlSequenceBuilder::build, Set.of(Collector.Characteristics.UNORDERED)); /** * (Copied from Collectors class) * Simple implementation class for {@code Collector}. * * @param the type of elements to be collected * @param the type of the result */ static class CollectorImpl implements Collector { private final Supplier supplier; private final BiConsumer accumulator; private final BinaryOperator combiner; private final Function finisher; private final Set characteristics; CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner, Function finisher, Set characteristics) { this.supplier = supplier; this.accumulator = accumulator; this.combiner = combiner; this.finisher = finisher; this.characteristics = characteristics; } @Override public BiConsumer accumulator() { return accumulator; } @Override public Supplier supplier() { return supplier; } @Override public BinaryOperator combiner() { return combiner; } @Override public Function finisher() { return finisher; } @Override public Set characteristics() { return characteristics; } } }