All Downloads are FREE. Search and download functionalities are using the official Maven repository.

reactor.groovy.ext.ComposableExtensions.groovy Maven / Gradle / Ivy

/*
 * Copyright (c) 2011-2013 GoPivotal, Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package reactor.groovy.ext

import groovy.transform.CompileStatic
import groovy.transform.TypeCheckingMode
import reactor.core.composable.Composable
import reactor.core.composable.Deferred
import reactor.core.composable.Promise
import reactor.core.composable.Stream
import reactor.function.*
import reactor.groovy.support.*
import reactor.tuple.Tuple2

/**
 * Glue for Groovy closures and operator overloading applied to Stream, Composable,
 * Promise and Deferred.
 * Also gives convenient Deferred handling by providing map/filter/consume operations
 *
 * @author Jon Brisbin
 * @author Stephane Maldini
 */
@CompileStatic
class ComposableExtensions {

	/**
	 * Alias
	 */
	static > X to(final X selfType, final Object key,
	                                         final reactor.core.Observable observable) {
		selfType.consume key, observable
	}

	/**
	 * Closure converters
	 */
	static  Composable map(final Deferred selfType, final Closure closure) {
		selfType.compose().map new ClosureFunction(closure)
	}

	static  Stream map(final Stream selfType, final Closure closure) {
		selfType.map new ClosureFunction(closure)
	}

	static  Promise map(final Promise selfType, final Closure closure) {
		selfType.map new ClosureFunction(closure)
	}

	static  Stream consume(final Stream selfType, final Closure closure) {
		selfType.consume new ClosureConsumer(closure)
	}

	static > Stream mapMany(final Stream selfType, final Closure closure) {
		selfType.mapMany new ClosureFunction(closure)
	}

	static > Promise bind(final Promise selfType, final Closure closure) {
		selfType.mapMany new ClosureFunction(closure)
	}

	static  Composable consume(final Deferred selfType, final Closure closure) {
		selfType.compose().consume new ClosureConsumer(closure)
	}

	static  Promise consume(final Promise selfType, final Closure closure) {
		selfType.consume new ClosureConsumer(closure)
	}

	static  Stream filter(final Stream selfType, final Closure closure) {
		selfType.filter new ClosurePredicate(closure)
	}

	static  Composable filter(final Deferred selfType, final Closure closure) {
		selfType.compose().filter new ClosurePredicate(closure)
	}

	static  Promise filter(final Promise selfType, final Closure closure) {
		selfType.filter new ClosurePredicate(closure)
	}

	static  Stream when(final Stream selfType, final Class exceptionType, final Closure closure) {
		selfType.when exceptionType, new ClosureConsumer(closure)
	}

	static  Composable when(final Deferred selfType, final Class exceptionType, final Closure closure) {
		selfType.compose().when exceptionType, new ClosureConsumer(closure)
	}

	static  Promise when(final Promise selfType, final Class exceptionType, final Closure closure) {
		selfType.when exceptionType, new ClosureConsumer(closure)
	}

	@CompileStatic(TypeCheckingMode.SKIP)
	static  Stream reduce(final Stream selfType, final Closure closure, V initial = null) {
		reduce selfType, closure, initial ? Functions.supplier((V)initial) : (Supplier)null
	}

	static  Stream reduce(final Stream selfType, final Closure closure, Closure initial) {
		reduce selfType, closure, new ClosureSupplier(initial)
	}

	@CompileStatic(TypeCheckingMode.SKIP)
	static  Stream reduce(final Stream selfType, final Closure closure, Supplier initial) {
		selfType.reduce new ClosureReduce(closure), initial
	}

	static  Promise onError(final Promise selfType, final Closure closure) {
		selfType.onError new ClosureConsumer(closure)
	}

	static  Promise onComplete(final Promise selfType, final Closure closure) {
		selfType.onComplete new ClosureConsumer>(closure)
	}

	static  Promise onSuccess(final Promise selfType, final Closure closure) {
		selfType.onSuccess new ClosureConsumer(closure)
	}

	static  Promise then(final Promise selfType, final Closure closureSuccess,
	                              final Closure closureError = null) {
		selfType.then(new ClosureFunction(closureSuccess), closureError ?
				new ClosureConsumer(closureError) : null)
	}

	/**
	 * Operator overloading
	 */

	@CompileStatic(TypeCheckingMode.SKIP)
	static  Stream mod(final Stream selfType, final Function, V> other) {
		selfType.reduce other, (Supplier)null
	}

	static  Stream mod(final Stream selfType, final Closure other) {
		reduce selfType, other
	}

	//Mapping
	static  Stream or(final Stream selfType, final Function other) {
		selfType.map other
	}

	static  Stream or(final Stream selfType, final Closure other) {
		map selfType, other
	}

	static  Composable or(final Deferred selfType, final Function other) {
		selfType.compose().map other
	}

	static  Composable or(final Deferred selfType, final Closure other) {
		map selfType, other
	}

	static  Promise or(final Promise selfType, final Function other) {
		selfType.then other, (Consumer) null
	}

	static  Promise or(final Promise selfType, final Closure other) {
		then selfType, other
	}


	//Filtering
	static  Stream and(final Stream selfType, final Closure other) {
		filter selfType, other
	}

	static  Promise and(final Promise selfType, final Closure other) {
		filter selfType, other
	}

	static  Composable and(final Deferred selfType, final Closure other) {
		filter selfType, other
	}

	static  Stream and(final Stream selfType, final Predicate other) {
		selfType.filter other
	}

	static  Promise and(final Promise selfType, final Predicate other) {
		selfType.filter other
	}

	static  Composable and(final Deferred selfType, final Predicate other) {
		selfType.compose().filter other
	}


	//Consuming
	static  Stream leftShift(final Stream selfType, final Consumer other) {
		selfType.consume other
	}

	static  Composable leftShift(final Deferred selfType, final Consumer other) {
		selfType.compose().consume other
	}

	static  Stream leftShift(final Stream selfType, final Closure other) {
		consume selfType, other
	}

	static  Composable leftShift(final Deferred selfType, final Closure other) {
		consume selfType, other
	}

	static  Promise leftShift(final Promise selfType, final Consumer other) {
		selfType.onSuccess other
	}

	static  Promise leftShift(final Promise selfType, final Closure other) {
		onSuccess selfType, other
	}

	//Accept
	static  Consumer leftShift(final Consumer selfType, T value) {
		selfType.accept value
		selfType
	}

	static > Deferred leftShift(final Deferred selfType, T value) {
		selfType.accept value
		selfType
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy