From 2a4d3d80256f1ed165a8eb45affd1e42aee95eec Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Tue, 2 May 2023 20:38:10 +0200 Subject: [PATCH] Created Property class and related work. --- .../ssg/property/Properties.groovy | 19 ++++ .../jessebrault/ssg/property/Property.groovy | 38 ++++++++ .../ssg/property/SimpleProperty.groovy | 93 +++++++++++++++++++ .../ssg/provider/AbstractProvider.groovy | 5 + .../ssg/provider/EmptyProvider.groovy | 39 ++++++++ .../jessebrault/ssg/provider/Provider.groovy | 11 +++ .../jessebrault/ssg/provider/Providers.groovy | 7 ++ .../ssg/provider/SimpleProvider.groovy | 5 + .../ssg/provider/SupplierBasedProvider.groovy | 5 + 9 files changed, 222 insertions(+) create mode 100644 api/src/main/groovy/com/jessebrault/ssg/property/Properties.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/property/Property.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/property/SimpleProperty.groovy create mode 100644 api/src/main/groovy/com/jessebrault/ssg/provider/EmptyProvider.groovy diff --git a/api/src/main/groovy/com/jessebrault/ssg/property/Properties.groovy b/api/src/main/groovy/com/jessebrault/ssg/property/Properties.groovy new file mode 100644 index 0000000..9048902 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/property/Properties.groovy @@ -0,0 +1,19 @@ +package com.jessebrault.ssg.property + +final class Properties { + + static Property get() { + new SimpleProperty<>() + } + + static Property get(T convention) { + new SimpleProperty<>(convention) + } + + static Property get(T convention, T t) { + new SimpleProperty<>(convention, t) + } + + private Properties() {} + +} diff --git a/api/src/main/groovy/com/jessebrault/ssg/property/Property.groovy b/api/src/main/groovy/com/jessebrault/ssg/property/Property.groovy new file mode 100644 index 0000000..48574d1 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/property/Property.groovy @@ -0,0 +1,38 @@ +package com.jessebrault.ssg.property + +import com.jessebrault.ssg.provider.Provider + +import java.util.function.Function +import java.util.function.UnaryOperator + +interface Property extends Provider { + + void set(T t) + void set(Provider provider) + void unset() + + default void leftShift(T t) { + this.set(t) + } + + default void leftShift(Provider provider) { + this.set(provider) + } + + T getConvention() + void setConvention(T t) + void setConvention(Provider provider) + void unsetConvention() + + void map(UnaryOperator operator) + void flatMap(Function> function) + + default void rightShift(UnaryOperator operator) { + this.map(operator) + } + + default void rightShift(Function> function) { + this.flatMap(function) + } + +} \ No newline at end of file diff --git a/api/src/main/groovy/com/jessebrault/ssg/property/SimpleProperty.groovy b/api/src/main/groovy/com/jessebrault/ssg/property/SimpleProperty.groovy new file mode 100644 index 0000000..34b4ae5 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/property/SimpleProperty.groovy @@ -0,0 +1,93 @@ +package com.jessebrault.ssg.property + +import com.jessebrault.ssg.provider.AbstractProvider +import com.jessebrault.ssg.provider.Provider +import com.jessebrault.ssg.provider.Providers +import groovy.transform.EqualsAndHashCode +import groovy.transform.NullCheck +import groovy.transform.PackageScope + +import java.util.function.Function +import java.util.function.UnaryOperator + +@PackageScope +@NullCheck +@EqualsAndHashCode(includeFields = true) +final class SimpleProperty extends AbstractProvider implements Property { + + private Provider convention = Providers.getEmpty() + private Provider tProvider = Providers.getEmpty() + + SimpleProperty(T convention) { + this.convention = Providers.of(convention) + } + + SimpleProperty(T convention, T t) { + this.convention = Providers.of(convention) + this.tProvider = Providers.of(t) + } + + SimpleProperty() {} + + @Override + T provide() { + this.tProvider.present ? this.tProvider.provide() : this.convention.provide() + } + + @Override + void set(T t) { + this.tProvider = Providers.of(t) + } + + @Override + void set(Provider provider) { + this.tProvider = provider + } + + @Override + void unset() { + this.tProvider = Providers.getEmpty() + } + + @Override + T getConvention() { + this.convention.provide() + } + + @Override + void setConvention(T t) { + this.convention = Providers.of(t) + } + + @Override + void setConvention(Provider provider) { + this.convention = provider + } + + @Override + void unsetConvention() { + this.convention = Providers.getEmpty() + } + + @Override + void map(UnaryOperator operator) { + def oldTProvider = this.tProvider + this.tProvider = Providers.fromSupplier { + operator.apply(oldTProvider.provide()) + } + } + + @Override + void flatMap(Function> function) { + def oldTProvider = this.tProvider + this.tProvider = Providers.fromSupplier { + function.apply(oldTProvider.provide()).provide() + } + } + + @Override + String toString() { + "SimpleProperty(convention: ${ this.convention }, tProvider: ${ this.tProvider })" + } + +} diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractProvider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractProvider.groovy index 9d3272a..98d28a2 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractProvider.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/AbstractProvider.groovy @@ -23,4 +23,9 @@ abstract class AbstractProvider implements Provider { }) } + @Override + boolean isEmpty() { + false + } + } diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/EmptyProvider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/EmptyProvider.groovy new file mode 100644 index 0000000..8e1c445 --- /dev/null +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/EmptyProvider.groovy @@ -0,0 +1,39 @@ +package com.jessebrault.ssg.provider + +import groovy.transform.EqualsAndHashCode +import groovy.transform.NullCheck +import groovy.transform.PackageScope + +@PackageScope +@NullCheck +@EqualsAndHashCode +final class EmptyProvider implements Provider { + + @Override + T provide() { + throw new NullPointerException('EmptyProvider cannot provide a value.') + } + + @Override + CollectionProvider plus(Provider other) { + CollectionProviders.fromSupplier { + [other.provide()] as Collection + } + } + + @Override + CollectionProvider asType(Class collectionProviderClass) { + CollectionProviders.fromCollection([]) as CollectionProvider + } + + @Override + boolean isEmpty() { + true + } + + @Override + String toString() { + "EmptyProvider()" + } + +} diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/Provider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/Provider.groovy index 4954a94..2473250 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/Provider.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/Provider.groovy @@ -1,7 +1,18 @@ package com.jessebrault.ssg.provider interface Provider { + T provide() + + @Deprecated CollectionProvider plus(Provider other) + CollectionProvider asType(Class collectionProviderClass) + + boolean isEmpty() + + default boolean isPresent() { + !this.empty + } + } \ No newline at end of file diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/Providers.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/Providers.groovy index ecb875f..8d62396 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/Providers.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/Providers.groovy @@ -1,9 +1,16 @@ package com.jessebrault.ssg.provider +import groovy.transform.NullCheck + import java.util.function.Supplier +@NullCheck final class Providers { + static Provider getEmpty() { + new EmptyProvider<>() + } + static Provider of(T t) { new SimpleProvider<>(t) } diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/SimpleProvider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/SimpleProvider.groovy index 585277f..2f7e661 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/SimpleProvider.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/SimpleProvider.groovy @@ -18,4 +18,9 @@ final class SimpleProvider extends AbstractProvider { this.t } + @Override + String toString() { + "SimpleProvider(t: ${ this.t })" + } + } diff --git a/api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedProvider.groovy b/api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedProvider.groovy index c6629c5..9f6c61c 100644 --- a/api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedProvider.groovy +++ b/api/src/main/groovy/com/jessebrault/ssg/provider/SupplierBasedProvider.groovy @@ -20,4 +20,9 @@ final class SupplierBasedProvider extends AbstractProvider { this.supplier.get() } + @Override + String toString() { + "SupplierBasedProvider(supplier: ${ this.supplier })" + } + }