Created Property class and related work.

This commit is contained in:
JesseBrault0709 2023-05-02 20:38:10 +02:00
parent 7204b1b694
commit 3b181307a1
9 changed files with 203 additions and 0 deletions

View File

@ -0,0 +1,11 @@
package com.jessebrault.ssg.property
final class Properties {
static <T> Property<T> get() {
new SimpleProperty<>()
}
private Properties() {}
}

View File

@ -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<T> extends Provider<T> {
void set(T t)
void set(Provider<T> provider)
void unset()
default void leftShift(T t) {
this.set(t)
}
default void leftShift(Provider<T> provider) {
this.set(provider)
}
T getConvention()
void setConvention(T t)
void setConvention(Provider<T> provider)
void unsetConvention()
void map(UnaryOperator<T> operator)
void flatMap(Function<T, Provider<T>> function)
default void rightShift(UnaryOperator<T> operator) {
this.map(operator)
}
default void rightShift(Function<T, Provider<T>> function) {
this.flatMap(function)
}
}

View File

@ -0,0 +1,82 @@
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<T> extends AbstractProvider<T> implements Property<T> {
private Provider<T> convention = Providers.getEmpty()
private Provider<T> tProvider = Providers.getEmpty()
@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<T> 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<T> provider) {
this.convention = provider
}
@Override
void unsetConvention() {
this.convention = Providers.getEmpty()
}
@Override
void map(UnaryOperator<T> operator) {
def oldTProvider = this.tProvider
this.tProvider = Providers.fromSupplier {
operator.apply(oldTProvider.provide())
}
}
@Override
void flatMap(Function<T, Provider<T>> function) {
def oldTProvider = this.tProvider
this.tProvider = Providers.fromSupplier {
function.apply(oldTProvider.provide()).provide()
}
}
@Override
String toString() {
"SimpleProperty(convention: ${ this.convention }, tProvider: ${ this.tProvider })"
}
}

View File

@ -23,4 +23,9 @@ abstract class AbstractProvider<T> implements Provider<T> {
})
}
@Override
boolean isEmpty() {
false
}
}

View File

@ -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<T> implements Provider<T> {
@Override
T provide() {
throw new NullPointerException('EmptyProvider cannot provide a value.')
}
@Override
CollectionProvider<T> plus(Provider<T> other) {
CollectionProviders.fromSupplier {
[other.provide()] as Collection<T>
}
}
@Override
CollectionProvider<T> asType(Class<CollectionProvider> collectionProviderClass) {
CollectionProviders.fromCollection([]) as CollectionProvider<T>
}
@Override
boolean isEmpty() {
true
}
@Override
String toString() {
"EmptyProvider()"
}
}

View File

@ -1,7 +1,18 @@
package com.jessebrault.ssg.provider
interface Provider<T> {
T provide()
@Deprecated
CollectionProvider<T> plus(Provider<T> other)
CollectionProvider<T> asType(Class<CollectionProvider> collectionProviderClass)
boolean isEmpty()
default boolean isPresent() {
!this.empty
}
}

View File

@ -1,9 +1,16 @@
package com.jessebrault.ssg.provider
import groovy.transform.NullCheck
import java.util.function.Supplier
@NullCheck
final class Providers {
static <T> Provider<T> getEmpty() {
new EmptyProvider<>()
}
static <T> Provider<T> of(T t) {
new SimpleProvider<>(t)
}

View File

@ -18,4 +18,9 @@ final class SimpleProvider<T> extends AbstractProvider<T> {
this.t
}
@Override
String toString() {
"SimpleProvider(t: ${ this.t })"
}
}

View File

@ -20,4 +20,9 @@ final class SupplierBasedProvider<T> extends AbstractProvider<T> {
this.supplier.get()
}
@Override
String toString() {
"SupplierBasedProvider(supplier: ${ this.supplier })"
}
}