public static BiFunction<AlgebraicDataType, DeriveContext, DeriveResult<DerivedCodeSpec>> derivator(DeriveUtils deriveUtils) { return (adt, deriveContext) -> traverseResults( deriveContext.makes(), Makes.cases() .lambdaVisitor( lazy(() -> MapperDerivator.derive(adt, deriveContext, deriveUtils))) .constructors( lazy( () -> StrictConstructorDerivator.derive(adt, deriveContext, deriveUtils))) .lazyConstructor( lazy( () -> LazyConstructorDerivator.derive(adt, deriveContext, deriveUtils))) .patternMatching( lazy( () -> PatternMatchingDerivator.derive(adt, deriveContext, deriveUtils))) .getters(lazy(() -> GettersDerivator.derive(adt, deriveContext, deriveUtils))) .modifiers(lazy(() -> ModiersDerivator.derive(adt, deriveContext, deriveUtils))) .catamorphism( lazy(() -> new CataDerivator(deriveUtils, deriveContext, adt).derive())) .hktCoerce(DeriveResult.result(DerivedCodeSpec.none()))) .map( codeSpecList -> codeSpecList.stream().reduce(DerivedCodeSpec.none(), DerivedCodeSpec::append)); }
public static BiFunction<AlgebraicDataType, DeriveContext, DeriveResult<DerivedCodeSpec>> derivator(DeriveUtils deriveUtils) { return (adt, deriveContext) -> traverseResults( Arrays.asList( lazy(() -> StrictConstructorDerivator.derive(adt, deriveContext, deriveUtils)), lazy(() -> LazyConstructorDerivator.derive(adt, deriveContext, deriveUtils)), lazy(() -> MapperDerivator.derive(adt, deriveContext, deriveUtils)), lazy(() -> GettersDerivator.derive(adt, deriveContext, deriveUtils)), lazy(() -> ModiersDerivator.derive(adt, deriveContext, deriveUtils)), lazy(() -> PatternMatchingDerivator.derive(adt, deriveContext, deriveUtils)))) .map( codeSpecList -> codeSpecList.stream().reduce(DerivedCodeSpec.none(), Utils::appendCodeSpecs)); }