From e87d46153fcdae7a3889d8e3e5705a15f8945261 Mon Sep 17 00:00:00 2001 From: JFronny Date: Thu, 24 Nov 2022 14:55:39 +0100 Subject: [PATCH] Introduce commons-manifold --- README.md | 9 ++++ buildSrc/build.gradle.kts | 2 + commons-manifold/build.gradle.kts | 19 ++++++++ .../java/lang/Iterable/IterableExt.java | 14 ++++++ .../extensions/java/util/Map/MapExt.java | 18 ++++++++ .../util/stream/BaseStream/BaseStreamExt.java | 7 +++ .../java/util/stream/Stream/StreamExt.java | 44 +++++++++++++++++++ .../extensions/org/w3c/dom/Node/NodeExt.java | 14 ++++++ .../org/w3c/dom/NodeList/NodeListExt.java | 35 +++++++++++++++ .../commons/manifold/ManifoldTest.java | 9 ++++ settings.gradle.kts | 1 + 11 files changed, 172 insertions(+) create mode 100644 README.md create mode 100644 commons-manifold/build.gradle.kts create mode 100644 commons-manifold/src/main/java/commons/extensions/java/lang/Iterable/IterableExt.java create mode 100644 commons-manifold/src/main/java/commons/extensions/java/util/Map/MapExt.java create mode 100644 commons-manifold/src/main/java/commons/extensions/java/util/stream/BaseStream/BaseStreamExt.java create mode 100644 commons-manifold/src/main/java/commons/extensions/java/util/stream/Stream/StreamExt.java create mode 100644 commons-manifold/src/main/java/commons/extensions/org/w3c/dom/Node/NodeExt.java create mode 100644 commons-manifold/src/main/java/commons/extensions/org/w3c/dom/NodeList/NodeListExt.java create mode 100644 commons-manifold/src/test/java/io/gitlab/jfronny/commons/manifold/ManifoldTest.java diff --git a/README.md b/README.md new file mode 100644 index 0000000..2bd6347 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# JfCommons +Common code for my java projects. Uses my common [build scripts](https://git.frohnmeyer-wds.de/Johannes/Scripts). + +## Modules +- commons: Common java code without a major theme or external dependencies +- [muscript](https://git.frohnmeyer-wds.de/Johannes/java-commons/src/branch/master/muscript): A simple scripting language +- commons-slf4j: SLF4J bindings for the logging abstraction in commons. Supports using commons as a backend for slf and slf as a commons backend. +- commons-gson: Shades my fork of gson and provides some utility classes +- commons-manifold: Some common code using the features of manifold-ext. Mainly extension classes. \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index ac9bd54..0319b04 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -5,8 +5,10 @@ plugins { repositories { mavenCentral() gradlePluginPortal() + maven("https://maven.frohnmeyer-wds.de/artifacts") } dependencies { implementation("org.gradle.kotlin:gradle-kotlin-dsl-plugins:2.3.3") + implementation("io.gitlab.jfronny:convention:1.2-SNAPSHOT") } \ No newline at end of file diff --git a/commons-manifold/build.gradle.kts b/commons-manifold/build.gradle.kts new file mode 100644 index 0000000..b8315a1 --- /dev/null +++ b/commons-manifold/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + id("commons.library") + id("jf.manifold") +} + +dependencies { + implementation(project(":")) +} + +publishing { + publications { + create("maven") { + groupId = "io.gitlab.jfronny" + artifactId = "commons-manifold" + + from(components["java"]) + } + } +} diff --git a/commons-manifold/src/main/java/commons/extensions/java/lang/Iterable/IterableExt.java b/commons-manifold/src/main/java/commons/extensions/java/lang/Iterable/IterableExt.java new file mode 100644 index 0000000..2e68f06 --- /dev/null +++ b/commons-manifold/src/main/java/commons/extensions/java/lang/Iterable/IterableExt.java @@ -0,0 +1,14 @@ +package commons.extensions.java.lang.Iterable; + +import manifold.ext.rt.api.*; + +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +@Extension +@Structural +public class IterableExt { + public static Stream stream(@This Iterable iterable) { + return StreamSupport.stream(iterable.spliterator(), false); + } +} diff --git a/commons-manifold/src/main/java/commons/extensions/java/util/Map/MapExt.java b/commons-manifold/src/main/java/commons/extensions/java/util/Map/MapExt.java new file mode 100644 index 0000000..646981e --- /dev/null +++ b/commons-manifold/src/main/java/commons/extensions/java/util/Map/MapExt.java @@ -0,0 +1,18 @@ +package commons.extensions.java.util.Map; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; + +import java.util.Iterator; +import java.util.Map; + +@Extension +public abstract class MapExt implements Iterable> { + public static Iterator> iterator(@This Map thiz) { + return thiz.entrySet().iterator(); + } + + public static V set(@This Map thiz, K key, V value) { + return thiz.put(key, value); + } +} diff --git a/commons-manifold/src/main/java/commons/extensions/java/util/stream/BaseStream/BaseStreamExt.java b/commons-manifold/src/main/java/commons/extensions/java/util/stream/BaseStream/BaseStreamExt.java new file mode 100644 index 0000000..67b4b8f --- /dev/null +++ b/commons-manifold/src/main/java/commons/extensions/java/util/stream/BaseStream/BaseStreamExt.java @@ -0,0 +1,7 @@ +package commons.extensions.java.util.stream.BaseStream; + +import manifold.ext.rt.api.Extension; + +@Extension +public abstract class BaseStreamExt implements Iterable { +} diff --git a/commons-manifold/src/main/java/commons/extensions/java/util/stream/Stream/StreamExt.java b/commons-manifold/src/main/java/commons/extensions/java/util/stream/Stream/StreamExt.java new file mode 100644 index 0000000..e7e3793 --- /dev/null +++ b/commons-manifold/src/main/java/commons/extensions/java/util/stream/Stream/StreamExt.java @@ -0,0 +1,44 @@ +package commons.extensions.java.util.stream.Stream; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Extension +public class StreamExt { + public static Set toSet(@This Stream thiz) { + return thiz.collect(LinkedHashSet::new, Set::add, Set::addAll); + } + + public static Map toMap(@This Stream thiz, Function keyMapper, Function valueMapper) { + return thiz.collect(Collectors.toMap(keyMapper, valueMapper)); + } + + public static Map toMap(@This Stream thiz, Function keyMapper) { + return thiz.toMap(keyMapper, Function.identity()); + } + + public static Map> groupingBy(@This Stream thiz, Function valueMapper) { + return thiz.collect(Collectors.groupingBy(valueMapper)); + } + + public static String join(@This Stream thiz) { + return thiz.collect(Collectors.joining()); + } + + public static String join(@This Stream thiz, String delimiter) { + return thiz.collect(Collectors.joining(delimiter)); + } + + public static String join(@This Stream thiz, char delimiter) { + return thiz.join("" + delimiter); + } + + public static Stream concat(@This Stream thiz, Stream other) { + return Stream.concat(thiz, other); + } +} diff --git a/commons-manifold/src/main/java/commons/extensions/org/w3c/dom/Node/NodeExt.java b/commons-manifold/src/main/java/commons/extensions/org/w3c/dom/Node/NodeExt.java new file mode 100644 index 0000000..8e1d4b8 --- /dev/null +++ b/commons-manifold/src/main/java/commons/extensions/org/w3c/dom/Node/NodeExt.java @@ -0,0 +1,14 @@ +package commons.extensions.org.w3c.dom.Node; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import org.w3c.dom.Node; + +@Extension +public class NodeExt { + public static boolean isWhitespace(@This Node thiz) { + if (thiz.nodeType == Node.TEXT_NODE && thiz.textContent.isBlank()) return true; + if (thiz.nodeType == Node.COMMENT_NODE) return true; + return false; + } +} diff --git a/commons-manifold/src/main/java/commons/extensions/org/w3c/dom/NodeList/NodeListExt.java b/commons-manifold/src/main/java/commons/extensions/org/w3c/dom/NodeList/NodeListExt.java new file mode 100644 index 0000000..a0edf0b --- /dev/null +++ b/commons-manifold/src/main/java/commons/extensions/org/w3c/dom/NodeList/NodeListExt.java @@ -0,0 +1,35 @@ +package commons.extensions.org.w3c.dom.NodeList; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +@Extension +public abstract class NodeListExt implements Iterable { + public static Iterator iterator(@This NodeList thiz) { + return new Iterator<>() { + private int index = 0; + @Override + public boolean hasNext() { + while (index < thiz.length && thiz[index].isWhitespace()) { + index++; + } + return index < thiz.length; + } + + @Override + public Node next() { + if (!hasNext()) throw new NoSuchElementException(); + return thiz[index++]; + } + }; + } + + public static Node get(@This NodeList thiz, int index) { + return thiz.item(index); + } +} diff --git a/commons-manifold/src/test/java/io/gitlab/jfronny/commons/manifold/ManifoldTest.java b/commons-manifold/src/test/java/io/gitlab/jfronny/commons/manifold/ManifoldTest.java new file mode 100644 index 0000000..769c0ca --- /dev/null +++ b/commons-manifold/src/test/java/io/gitlab/jfronny/commons/manifold/ManifoldTest.java @@ -0,0 +1,9 @@ +package io.gitlab.jfronny.commons.manifold; + +public class ManifoldTest { + public static void main(String[] args) { + for (String s : args.stream().stream()) { + System.out.println(s); + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 1d96549..0be3b6c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,6 @@ rootProject.name = "Commons" include("commons-gson") +include("commons-manifold") include("commons-slf4j") include("muscript")