Created Property class and related work.
This commit is contained in:
parent
7204b1b694
commit
3b181307a1
@ -0,0 +1,11 @@
|
||||
package com.jessebrault.ssg.property
|
||||
|
||||
final class Properties {
|
||||
|
||||
static <T> Property<T> get() {
|
||||
new SimpleProperty<>()
|
||||
}
|
||||
|
||||
private Properties() {}
|
||||
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
||||
}
|
@ -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 })"
|
||||
}
|
||||
|
||||
}
|
@ -23,4 +23,9 @@ abstract class AbstractProvider<T> implements Provider<T> {
|
||||
})
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean isEmpty() {
|
||||
false
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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()"
|
||||
}
|
||||
|
||||
}
|
@ -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
|
||||
}
|
||||
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
@ -18,4 +18,9 @@ final class SimpleProvider<T> extends AbstractProvider<T> {
|
||||
this.t
|
||||
}
|
||||
|
||||
@Override
|
||||
String toString() {
|
||||
"SimpleProvider(t: ${ this.t })"
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,4 +20,9 @@ final class SupplierBasedProvider<T> extends AbstractProvider<T> {
|
||||
this.supplier.get()
|
||||
}
|
||||
|
||||
@Override
|
||||
String toString() {
|
||||
"SupplierBasedProvider(supplier: ${ this.supplier })"
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user