From a87a42a153c8eaaf51f2df8561d66597c3fdcf01 Mon Sep 17 00:00:00 2001 From: Hugo Kat Date: Mon, 17 Oct 2022 22:10:53 +1100 Subject: [PATCH 01/30] #1842 Setting up project and creating example classes. Issues running site and deploy --- currying/README.md | 0 currying/pom.xml | 81 +++++++++++ .../main/java/com/iluwatar/currying/App.java | 101 +++++++++++++ .../main/java/com/iluwatar/currying/Book.java | 133 ++++++++++++++++++ .../java/com/iluwatar/currying/Genre.java | 42 ++++++ pom.xml | 1 + 6 files changed, 358 insertions(+) create mode 100644 currying/README.md create mode 100644 currying/pom.xml create mode 100644 currying/src/main/java/com/iluwatar/currying/App.java create mode 100644 currying/src/main/java/com/iluwatar/currying/Book.java create mode 100644 currying/src/main/java/com/iluwatar/currying/Genre.java diff --git a/currying/README.md b/currying/README.md new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/currying/pom.xml b/currying/pom.xml new file mode 100644 index 000000000000..96952810abc5 --- /dev/null +++ b/currying/pom.xml @@ -0,0 +1,81 @@ + + + + 4.0.0 + + + java-design-patterns + com.iluwatar + 1.26.0-SNAPSHOT + + currying + + + junit + junit + 4.12 + test + + + org.junit.jupiter + junit-jupiter + 5.7.1 + test + + + + + 15 + 15 + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + + + + com.iluwatar.currying.App + + + + + + + + + + \ No newline at end of file diff --git a/currying/src/main/java/com/iluwatar/currying/App.java b/currying/src/main/java/com/iluwatar/currying/App.java new file mode 100644 index 000000000000..c8f78e5d6e50 --- /dev/null +++ b/currying/src/main/java/com/iluwatar/currying/App.java @@ -0,0 +1,101 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +/* +* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). +* +* The MIT License +* Copyright © 2014-2022 Ilkka Seppälä +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ +package com.iluwatar.currying; + +import java.time.LocalDate; + +/** +* This is a Javadoc comment to pass the style check. +*/ + +public class App { + /** + * This is a Javadoc comment to pass the style check. + */ + public static void main(String[] args) { + // Defining genre book functions + Book.AddAuthor fantasyBookFunc = Book.builder().withGenre(Genre.FANTASY); + Book.AddAuthor horrorBookFunc = Book.builder().withGenre(Genre.HORROR); + Book.AddAuthor scifiBookFunc = Book.builder().withGenre(Genre.SCI_FI); + + // Defining author book functions + Book.AddTitle kingFantasyBooksFunc = fantasyBookFunc.withAuthor("Stephen King"); + Book.AddTitle kingHorrorBooksFunc = horrorBookFunc.withAuthor("Stephen King"); + Book.AddTitle rowlingFantasyBooksFunc = fantasyBookFunc.withAuthor("J.K. Rowling"); + + // Creates horror books by Stephen King + Book shining = kingHorrorBooksFunc.withTitle("The Shining") + .withPublicationDate(LocalDate.of(1977, 1, 28)); + Book it = kingHorrorBooksFunc.withTitle("It") + .withPublicationDate(LocalDate.of(1986, 9, 15)); + + // Creates fantasy books by Stephen King + Book darkTower = kingFantasyBooksFunc.withTitle("The Dark Tower: Gunslinger") + .withPublicationDate(LocalDate.of(1982, 6, 10)); + + // Creates fantasy books by J.K. Rowling + Book chamberOfSecrets = rowlingFantasyBooksFunc.withTitle("Harry Potter and the Chamber of Secrets") + .withPublicationDate(LocalDate.of(1998, 7, 2)); + + // Create sci-fi books + Book dune = scifiBookFunc.withAuthor("Frank Herbert") + .withTitle("Dune") + .withPublicationDate(LocalDate.of(1965, 8, 1)); + Book foundation = scifiBookFunc.withAuthor("Isaac Asimov") + .withTitle("Foundation") + .withPublicationDate(LocalDate.of(1942, 5, 1)); + + System.out.println(shining); + System.out.println(it); + System.out.println(darkTower); + System.out.println(chamberOfSecrets); + System.out.println(dune); + System.out.println(foundation); + } +} \ No newline at end of file diff --git a/currying/src/main/java/com/iluwatar/currying/Book.java b/currying/src/main/java/com/iluwatar/currying/Book.java new file mode 100644 index 000000000000..f1e2d7cce399 --- /dev/null +++ b/currying/src/main/java/com/iluwatar/currying/Book.java @@ -0,0 +1,133 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.currying; + +import java.time.LocalDate; +import java.util.Objects; +import java.util.function.Function; + +/** + * This is a Javadoc comment to pass the style check. + */ +public class Book { + private Genre genre; + private String author; + private String title; + private LocalDate publicationDate; + + /** + * This is a Javadoc comment to pass the style check. + */ + Book(Genre genre, String author, String title, LocalDate publicationDate) { + this.genre = genre; + this.author = author; + this.title = title; + this.publicationDate = publicationDate; + } + + /** + * This is a Javadoc comment to pass the style check. + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Book book = (Book) o; + return Objects.equals(author, book.author) + && Objects.equals(genre, book.genre) + && Objects.equals(title, book.title) + && Objects.equals(publicationDate, book.publicationDate); + } + + /** + * This is a Javadoc comment to pass the style check. + */ + @Override + public int hashCode() { + return Objects.hash(author, genre, title, publicationDate); + } + + /** + * This is a Javadoc comment to pass the style check. + */ + @Override + public String toString() { + return "Book{" + "genre=" + genre + ", author='" + author + '\'' + + ", title='" + title + '\'' + ", publicationDate=" + publicationDate + '}'; + } + + /** + * This is a Javadoc comment to pass the style check. + */ + static Function>>> BOOK_CREATOR = // + genre + -> author + -> title + -> publicationDate + -> new Book(genre, author, title, publicationDate); + + /** + * This is a Javadoc comment to pass the style check. + */ + public static AddGenre builder() { + return genre + -> author + -> title + -> publicationDate + -> new Book(genre, author, title, publicationDate); + } + + /** + * This is a Javadoc comment to pass the style check. + */ + public interface AddGenre { + Book.AddAuthor withGenre(Genre genre); + } + + /** + * This is a Javadoc comment to pass the style check. + */ + public interface AddAuthor { + Book.AddTitle withAuthor(String author); + } + + /** + * This is a Javadoc comment to pass the style check. + */ + public interface AddTitle { + Book.AddPublicationDate withTitle(String title); + } + + /** + * This is a Javadoc comment to pass the style check. + */ + public interface AddPublicationDate { + Book withPublicationDate(LocalDate publicationDate); + } +} \ No newline at end of file diff --git a/currying/src/main/java/com/iluwatar/currying/Genre.java b/currying/src/main/java/com/iluwatar/currying/Genre.java new file mode 100644 index 000000000000..795eb5b8288e --- /dev/null +++ b/currying/src/main/java/com/iluwatar/currying/Genre.java @@ -0,0 +1,42 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.currying; + +/** + * This is a Javadoc comment to pass the style check. + */ +public enum Genre { + FANTASY, + HORROR, + SCI_FI; + + /** + * This is a Javadoc comment to pass the style check. + */ + @Override + public String toString() { + return super.toString(); + } +} diff --git a/pom.xml b/pom.xml index 3aacbad55d4a..27126704685f 100644 --- a/pom.xml +++ b/pom.xml @@ -231,6 +231,7 @@ composite-view metadata-mapping service-to-worker + currying From 02d2598469669e3575d24f75cc676f139bf3330f Mon Sep 17 00:00:00 2001 From: Hugo Kat Date: Tue, 18 Oct 2022 11:41:44 +1100 Subject: [PATCH 02/30] #1842 Added unit tests --- .../java/com/iluwatar/currying/AppTest.java | 36 +++++++++ .../iluwatar/currying/BookCurryingTest.java | 76 +++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 currying/src/test/java/com/iluwatar/currying/AppTest.java create mode 100644 currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java diff --git a/currying/src/test/java/com/iluwatar/currying/AppTest.java b/currying/src/test/java/com/iluwatar/currying/AppTest.java new file mode 100644 index 000000000000..450597922dbf --- /dev/null +++ b/currying/src/test/java/com/iluwatar/currying/AppTest.java @@ -0,0 +1,36 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.currying; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +public class AppTest { + @Test + void executesWithoutExceptions() { + assertDoesNotThrow(() -> App.main(new String[]{})); + } +} diff --git a/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java b/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java new file mode 100644 index 000000000000..b5d479b9950d --- /dev/null +++ b/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java @@ -0,0 +1,76 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.currying; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.BeforeClass; +import org.junit.Test; + +import java.time.LocalDate; + +/** + * Unit tests for the Book class + */ +public class BookCurryingTest { + private static Book expectedBook; + + @BeforeClass + public static void initialiseBook() { + expectedBook = new Book(Genre.FANTASY, + "Dave", + "Into the Night", + LocalDate.of(2002, 4, 7)); + } + + /** + * Tests that the expected book can be created via curried functions + */ + @Test + public void createsExpectedBook() { + Book curriedBook = Book.builder() + .withGenre(Genre.FANTASY) + .withAuthor("Dave") + .withTitle("Into the Night") + .withPublicationDate(LocalDate.of(2002, 4, 7)); + + assertEquals(expectedBook, curriedBook); + } + + /** + * Tests that an intermediate curried function can be used to create the expected book + */ + @Test + public void functionCreatesExpectedBook() { + Book.AddTitle daveFantasyBookFunc = Book.builder() + .withGenre(Genre.FANTASY) + .withAuthor("Dave"); + + Book curriedBook = daveFantasyBookFunc.withTitle("Into the Night") + .withPublicationDate(LocalDate.of(2002, 4, 7)); + + assertEquals(expectedBook, curriedBook); + } +} From b0987ef6bbb334b26ccc916d6e8a6f6741e29e64 Mon Sep 17 00:00:00 2001 From: Hugo Kat Date: Tue, 18 Oct 2022 11:50:34 +1100 Subject: [PATCH 03/30] #1842 Improved example --- .../main/java/com/iluwatar/currying/App.java | 37 +++---------------- .../main/java/com/iluwatar/currying/Book.java | 37 ++++--------------- 2 files changed, 13 insertions(+), 61 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/App.java b/currying/src/main/java/com/iluwatar/currying/App.java index c8f78e5d6e50..2f6554b98447 100644 --- a/currying/src/main/java/com/iluwatar/currying/App.java +++ b/currying/src/main/java/com/iluwatar/currying/App.java @@ -22,30 +22,6 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -/* -* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). -* -* The MIT License -* Copyright © 2014-2022 Ilkka Seppälä -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in -* all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -* THE SOFTWARE. -*/ package com.iluwatar.currying; import java.time.LocalDate; @@ -53,7 +29,6 @@ /** * This is a Javadoc comment to pass the style check. */ - public class App { /** * This is a Javadoc comment to pass the style check. @@ -69,13 +44,9 @@ public static void main(String[] args) { Book.AddTitle kingHorrorBooksFunc = horrorBookFunc.withAuthor("Stephen King"); Book.AddTitle rowlingFantasyBooksFunc = fantasyBookFunc.withAuthor("J.K. Rowling"); - // Creates horror books by Stephen King + // Creates books by Stephen King (horror and fantasy genres) Book shining = kingHorrorBooksFunc.withTitle("The Shining") .withPublicationDate(LocalDate.of(1977, 1, 28)); - Book it = kingHorrorBooksFunc.withTitle("It") - .withPublicationDate(LocalDate.of(1986, 9, 15)); - - // Creates fantasy books by Stephen King Book darkTower = kingFantasyBooksFunc.withTitle("The Dark Tower: Gunslinger") .withPublicationDate(LocalDate.of(1982, 6, 10)); @@ -91,10 +62,14 @@ public static void main(String[] args) { .withTitle("Foundation") .withPublicationDate(LocalDate.of(1942, 5, 1)); + System.out.println("Stephen King Books:"); System.out.println(shining); - System.out.println(it); System.out.println(darkTower); + + System.out.println("J.K. Rowling Books:"); System.out.println(chamberOfSecrets); + + System.out.println("Sci-fi Books:"); System.out.println(dune); System.out.println(foundation); } diff --git a/currying/src/main/java/com/iluwatar/currying/Book.java b/currying/src/main/java/com/iluwatar/currying/Book.java index f1e2d7cce399..9ed28899d6ce 100644 --- a/currying/src/main/java/com/iluwatar/currying/Book.java +++ b/currying/src/main/java/com/iluwatar/currying/Book.java @@ -32,14 +32,11 @@ * This is a Javadoc comment to pass the style check. */ public class Book { - private Genre genre; - private String author; - private String title; - private LocalDate publicationDate; + private final Genre genre; + private final String author; + private final String title; + private final LocalDate publicationDate; - /** - * This is a Javadoc comment to pass the style check. - */ Book(Genre genre, String author, String title, LocalDate publicationDate) { this.genre = genre; this.author = author; @@ -47,9 +44,6 @@ public class Book { this.publicationDate = publicationDate; } - /** - * This is a Javadoc comment to pass the style check. - */ @Override public boolean equals(Object o) { if (this == o) { @@ -65,17 +59,11 @@ public boolean equals(Object o) { && Objects.equals(publicationDate, book.publicationDate); } - /** - * This is a Javadoc comment to pass the style check. - */ @Override public int hashCode() { return Objects.hash(author, genre, title, publicationDate); } - /** - * This is a Javadoc comment to pass the style check. - */ @Override public String toString() { return "Book{" + "genre=" + genre + ", author='" + author + '\'' @@ -83,7 +71,7 @@ public String toString() { } /** - * This is a Javadoc comment to pass the style check. + * Curried unary book create functions. */ static Function>>> BOOK_CREATOR = // genre @@ -93,7 +81,8 @@ public String toString() { -> new Book(genre, author, title, publicationDate); /** - * This is a Javadoc comment to pass the style check. + * Implements the builder pattern using functional interfaces to create a more readable + * book creator function. */ public static AddGenre builder() { return genre @@ -103,30 +92,18 @@ public static AddGenre builder() { -> new Book(genre, author, title, publicationDate); } - /** - * This is a Javadoc comment to pass the style check. - */ public interface AddGenre { Book.AddAuthor withGenre(Genre genre); } - /** - * This is a Javadoc comment to pass the style check. - */ public interface AddAuthor { Book.AddTitle withAuthor(String author); } - /** - * This is a Javadoc comment to pass the style check. - */ public interface AddTitle { Book.AddPublicationDate withTitle(String title); } - /** - * This is a Javadoc comment to pass the style check. - */ public interface AddPublicationDate { Book withPublicationDate(LocalDate publicationDate); } From fd1a54ec3e0b3c3024f64d8472867ffc00aebf3e Mon Sep 17 00:00:00 2001 From: Hugo Kat Date: Tue, 18 Oct 2022 11:58:49 +1100 Subject: [PATCH 04/30] #1842 Added UML class diagram --- currying/etc/currying.urm.puml | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 currying/etc/currying.urm.puml diff --git a/currying/etc/currying.urm.puml b/currying/etc/currying.urm.puml new file mode 100644 index 000000000000..8ae648c6eee6 --- /dev/null +++ b/currying/etc/currying.urm.puml @@ -0,0 +1,45 @@ +@startuml +package com.iluwatar.currying { + class App { + + App() + + main(args : String[]) {static} + } + class Book { + ~ BOOK_CREATOR : Function>>> {static} + - author : String + - genre : Genre + - publicationDate : LocalDate + - title : String + ~ Book(genre : Genre, author : String, title : String, publicationDate : LocalDate) + + builder() : AddGenre {static} + + equals(o : Object) : boolean + + hashCode() : int + + toString() : String + } + interface AddAuthor { + + withAuthor(String) : AddTitle {abstract} + } + interface AddGenre { + + withGenre(Genre) : AddAuthor {abstract} + } + interface AddPublicationDate { + + withPublicationDate(LocalDate) : Book {abstract} + } + interface AddTitle { + + withTitle(String) : AddPublicationDate {abstract} + } + enum Genre { + + FANTASY {static} + + HORROR {static} + + SCI_FI {static} + + toString() : String + + valueOf(name : String) : Genre {static} + + values() : Genre[] {static} + } +} +Book --> "-genre" Genre +AddPublicationDate ..+ Book +AddAuthor ..+ Book +AddTitle ..+ Book +AddGenre ..+ Book +@enduml \ No newline at end of file From a521101567a03b4922a759aab84a298fd9d759ee Mon Sep 17 00:00:00 2001 From: Hugo Kat Date: Tue, 18 Oct 2022 16:09:36 +1100 Subject: [PATCH 05/30] #1842 Added comments to Genre class --- currying/src/main/java/com/iluwatar/currying/Genre.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/currying/src/main/java/com/iluwatar/currying/Genre.java b/currying/src/main/java/com/iluwatar/currying/Genre.java index 795eb5b8288e..439f24703ac0 100644 --- a/currying/src/main/java/com/iluwatar/currying/Genre.java +++ b/currying/src/main/java/com/iluwatar/currying/Genre.java @@ -25,7 +25,7 @@ package com.iluwatar.currying; /** - * This is a Javadoc comment to pass the style check. + * Enum representing different book genres. */ public enum Genre { FANTASY, From 86d5ac010c3e69d82ee52869223ff832d1bf7d34 Mon Sep 17 00:00:00 2001 From: Hugo Kat Date: Tue, 18 Oct 2022 16:10:04 +1100 Subject: [PATCH 06/30] #1842 Improved readability of lambda function --- currying/src/main/java/com/iluwatar/currying/Book.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/Book.java b/currying/src/main/java/com/iluwatar/currying/Book.java index 9ed28899d6ce..833c5d4cfacf 100644 --- a/currying/src/main/java/com/iluwatar/currying/Book.java +++ b/currying/src/main/java/com/iluwatar/currying/Book.java @@ -73,8 +73,8 @@ public String toString() { /** * Curried unary book create functions. */ - static Function>>> BOOK_CREATOR = // - genre + static Function>>> BOOK_CREATOR + = genre -> author -> title -> publicationDate From 38793ee5b5615fc16d38597cebeed4bd86c46f96 Mon Sep 17 00:00:00 2001 From: Hugo Kat Date: Tue, 18 Oct 2022 16:13:02 +1100 Subject: [PATCH 07/30] #1842 Started working on the README and created initial UML --- currying/README.md | 125 ++++++++++++++++++++++++++++++++++ currying/etc/currying.urm.png | Bin 0 -> 66753 bytes 2 files changed, 125 insertions(+) create mode 100644 currying/etc/currying.urm.png diff --git a/currying/README.md b/currying/README.md index e69de29bb2d1..c7f0928e134f 100644 --- a/currying/README.md +++ b/currying/README.md @@ -0,0 +1,125 @@ +--- +layout: pattern +title: Currying +folder: currying +permalink: /patterns/currying/ +categories: Functional +language: en +tags: + - FIGURE OUT WHAT TAG +--- + +## Name / classification +Currying + +## Intent +WHAT IS CURRYING TRYING TO ACHIEVE? + +## Explanation +Real-world example +> Consider a librarian who wants to populate their library with books. The librarian wants functions which can create +> books corresponding to specific genres and authors. Currying makes this possible by writing a curried book builder +> function and utilising partial application. + +In plain words +> Decompose a function that take multiple arguments into multiple functions that take a single argument. + +Wikipedia says +> Currying is the technique of converting a function that takes multiple arguments into a sequence of functions that +> each take a single argument. Given a function $f:(X \times Y) \rightarrow Z$, currying constructs a new function $h:X \rightarrow +> (Y\rightarrow Z)$. $h$ takes an argument from $X$ and returns a function which maps $Y$ to $Z$. Hence, +> $h(x)(y) = f(x, y)$. + +Programmatic example +We have a `Book` class and `Genre` enum +```java +public class Book { + private final Genre genre; + private final String author; + private final String title; + private final LocalDate publicationDate; + + Book(Genre genre, String author, String title, LocalDate publicationDate) { + this.genre = genre; + this.author = author; + this.title = title; + this.publicationDate = publicationDate; + } +} + +public enum Genre { + FANTASY, + HORROR, + SCI_FI; +} +``` +We could easily create a `Book` object with the following method +```java +Book createBook(Genre genre, String author, String title, LocalDate publicationDate) { + return new Book(genre, author, title, publicationDate); +} +``` +However, what if we only wanted to create books from the `FANTASY` genre? We could pass in the `FANTASY` parameter on each method call; however, this is repetitive. We could define a new method specifically for creating `FANTASY` books; however, it is infeasible to create a new method for each book genre. The solution is to create a curried function +```java +static Function>>> BOOK_CREATOR + = genre + -> author + -> title + -> publicationDate + -> new Book(genre, author, title, publicationDate); +``` +Note that the order of the parameters is important. `genre` must come before `author`, `author` must come before `title` and so on. We must be considerate of this when writing curried functions to take full advantage of partial application. Using the above function, we can define a new function `fantasyBookFunc`, to generate `FANTASY` books as follows +```java +Function>> fantasyBookFunc = Book.BOOK_CREATOR.apply(Genre.FANTASY); +``` +Unfortunately, the type signature of `BOOK_CREATOR` and `fantasyBookFunc` are difficult to read and understand. We can improve this by using the [builder pattern](https://java-design-patterns.com/patterns/builder/) and functional interfaces. +```java +public static AddGenre builder() { + return genre + -> author + -> title + -> publicationDate + -> new Book(genre, author, title, publicationDate); +} + +public interface AddGenre { +Book.AddAuthor withGenre(Genre genre); +} + +public interface AddAuthor { +Book.AddTitle withAuthor(String author); +} + +public interface AddTitle { +Book.AddPublicationDate withTitle(String title); +} + +public interface AddPublicationDate { +Book withPublicationDate(LocalDate publicationDate); +} +``` +The semantics of the `builder` function can easily be understood. The `builder` function returns a functional interface `AddGenre`, which adds the genre to the book. Similarity, the `AddGenre` functional interface returns another functional interface `AddTitle`, which adds the title to the book and so on, until the `AddPublicationDate` functional interface returns a `Book`. + +## Class diagram +![currying-uml](./etc/currying.urm.png) + +## Applicability +A curried function which has only been passed some of its arguments is called a partial application. Partial application +allows for the creation of functions with some pre-defined data in their scope, since partial application can be used to +create specialised functions with lower arity. This abstraction can help keep code readable and concise. Therefore, currying is useful when frequently calling functions with fixed parameters. + +## Known uses +Most functional programming languages support curried functions. A popular example is [Haskell](https://www.haskell.org/), in which all functions are considered curried. + +## Consequences +Pros +* Currying allows for partial application, which can be used to create specialised functions concisely. + +Cons +* The order of the parameters in a curried function is important since we want to take advantage of partial application. It is best to input the most general parameters first and input specific parameters lasts. +* As shown in the programmatic example above, curried functions with several parameters have a cumbersome type signature (in Java). + +## Credits +* [Currying in Java](https://www.baeldung.com/java-currying) +* [What Is Currying in Programming](https://towardsdatascience.com/what-is-currying-in-programming-56fd57103431#:~:text=Currying%20is%20helpful%20when%20you,concise%2C%20and%20more%20readable%20solution.) +* [Why the fudge should I use currying?](https://medium.com/dailyjs/why-the-fudge-should-i-use-currying-84e4000c8743) \ No newline at end of file diff --git a/currying/etc/currying.urm.png b/currying/etc/currying.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b6141fd514d1e4dc9198a9ec209f2babf2b93e GIT binary patch literal 66753 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%0A3etyUgP5-ST_7kq%U z5o!p|AYq`vOiuAI6RDFtzZT^iMiIr62>Y7Ae*lsu?Z^`3O=y?ujvrOn?E**V$$eR= zAL{}gW2lIe584wbtD;ZsffQ_t7%0fjH4oyf$L3-pO0-{h0x3sQpOdek`O1tp)a>nQ zlybzfqF-B2BW=alqI>AvAcN0`n zP-&nRy#Q0|CowD-6d_Pfjs!W=LqdRLU?Hcg;{u|9H_58IaGx$USZI`2m1$D~`{q8$ zU_ztSa1Al|Q%36c_!COnp}Qsu7I4{)#EMfMi&pIJu+67UJ3JX43TN|tTv*Jcq*21@ zxgoRmLZm}ZPOXylp&$BjcLLCd^4dm784;izR#sLMy~(Hg)Lx+&&{&pH+pGKOv23^e z#deF)f(%#G$bjac!Ah2&qK8mKndrVAI+% z>?8i=khUjLa+<>e90EI(l%Dg)xasI>Vyg(f%@`+Rc4lH%ackjtB??>a=IhJ+MQREU&ALU$I8ylDT ziG+7L7Hl~1QlxJ91v;@3}CC88|%tL`S+pTrH$Iw_ggxLE{lkU{uHpR@Otee z8K8dBckgn$Vt3Z#XZh(rZs!gsog$&aGxaRV%HuAlmZ7CI713@zN+XQx)z2ApD4Xws z3bEBDa3Sf$4PFs!WblxFMZQUW8%PG>!Dd%{?Ixp8EF_`tt&i3&B#iINoH{A~36)l1 z?HQxTprYb0v5&On9`xIJ?}fDOIkN_3V%hfVxjBa0N>pEKuyssGOO)o|MjX!qim<=i zhyUWTz!duqXuO2xsNu6+rmMWoK^;PKg%RE70BkQ^b1Gz0rw{Pi%gs?JusL}qVk3^y zO#u!^*HosQ2Zs)p&j2DEJ$$|v6v`o~>8iw&{-*C3M?;^OZfP9;*Ppy-;JRae7}GI; zD_i#p-bhLR6pZJRp|wbj9mI7~xE{}__hB`lt<@YRZ#YEn74P2(ZzMxoR)8~78})++ znaI*NK6~+WD&`pHUz*kPW);mD^(|L#Iv}_*kt)xC Date: Tue, 18 Oct 2022 16:21:17 +1100 Subject: [PATCH 08/30] #1842 Added example to README --- currying/README.md | 63 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/currying/README.md b/currying/README.md index c7f0928e134f..2d9596467835 100644 --- a/currying/README.md +++ b/currying/README.md @@ -31,7 +31,7 @@ Wikipedia says > $h(x)(y) = f(x, y)$. Programmatic example -We have a `Book` class and `Genre` enum +We have a `Book` class and `Genre` enum. ```java public class Book { private final Genre genre; @@ -53,13 +53,13 @@ public enum Genre { SCI_FI; } ``` -We could easily create a `Book` object with the following method +We could easily create a `Book` object with the following method: ```java Book createBook(Genre genre, String author, String title, LocalDate publicationDate) { return new Book(genre, author, title, publicationDate); } ``` -However, what if we only wanted to create books from the `FANTASY` genre? We could pass in the `FANTASY` parameter on each method call; however, this is repetitive. We could define a new method specifically for creating `FANTASY` books; however, it is infeasible to create a new method for each book genre. The solution is to create a curried function +However, what if we only wanted to create books from the `FANTASY` genre? We could pass in the `FANTASY` parameter on each method call; however, this is repetitive. We could define a new method specifically for creating `FANTASY` books; however, it is infeasible to create a new method for each book genre. The solution is to create a curried function. ```java static Function>>> BOOK_CREATOR = genre @@ -68,7 +68,7 @@ static Function publicationDate -> new Book(genre, author, title, publicationDate); ``` -Note that the order of the parameters is important. `genre` must come before `author`, `author` must come before `title` and so on. We must be considerate of this when writing curried functions to take full advantage of partial application. Using the above function, we can define a new function `fantasyBookFunc`, to generate `FANTASY` books as follows +Note that the order of the parameters is important. `genre` must come before `author`, `author` must come before `title` and so on. We must be considerate of this when writing curried functions to take full advantage of partial application. Using the above function, we can define a new function `fantasyBookFunc`, to generate `FANTASY` books as follows: ```java Function>> fantasyBookFunc = Book.BOOK_CREATOR.apply(Genre.FANTASY); ``` @@ -98,7 +98,60 @@ public interface AddPublicationDate { Book withPublicationDate(LocalDate publicationDate); } ``` -The semantics of the `builder` function can easily be understood. The `builder` function returns a functional interface `AddGenre`, which adds the genre to the book. Similarity, the `AddGenre` functional interface returns another functional interface `AddTitle`, which adds the title to the book and so on, until the `AddPublicationDate` functional interface returns a `Book`. +The semantics of the `builder` function can easily be understood. The `builder` function returns a functional interface `AddGenre`, which adds the genre to the book. Similarity, the `AddGenre` functional interface returns another functional interface `AddTitle`, which adds the title to the book and so on, until the `AddPublicationDate` functional interface returns a `Book`. The below example demonstrates how partial application can be used with the `builder` function to create specialised book builder functions. +```java +public static void main(String[] args) { + // Defining genre book functions + Book.AddAuthor fantasyBookFunc = Book.builder().withGenre(Genre.FANTASY); + Book.AddAuthor horrorBookFunc = Book.builder().withGenre(Genre.HORROR); + Book.AddAuthor scifiBookFunc = Book.builder().withGenre(Genre.SCI_FI); + + // Defining author book functions + Book.AddTitle kingFantasyBooksFunc = fantasyBookFunc.withAuthor("Stephen King"); + Book.AddTitle kingHorrorBooksFunc = horrorBookFunc.withAuthor("Stephen King"); + Book.AddTitle rowlingFantasyBooksFunc = fantasyBookFunc.withAuthor("J.K. Rowling"); + + // Creates books by Stephen King (horror and fantasy genres) + Book shining = kingHorrorBooksFunc.withTitle("The Shining") + .withPublicationDate(LocalDate.of(1977, 1, 28)); + Book darkTower = kingFantasyBooksFunc.withTitle("The Dark Tower: Gunslinger") + .withPublicationDate(LocalDate.of(1982, 6, 10)); + + // Creates fantasy books by J.K. Rowling + Book chamberOfSecrets = rowlingFantasyBooksFunc.withTitle("Harry Potter and the Chamber of Secrets") + .withPublicationDate(LocalDate.of(1998, 7, 2)); + + // Create sci-fi books + Book dune = scifiBookFunc.withAuthor("Frank Herbert") + .withTitle("Dune") + .withPublicationDate(LocalDate.of(1965, 8, 1)); + Book foundation = scifiBookFunc.withAuthor("Isaac Asimov") + .withTitle("Foundation") + .withPublicationDate(LocalDate.of(1942, 5, 1)); + + System.out.println("Stephen King Books:"); + System.out.println(shining); + System.out.println(darkTower); + + System.out.println("J.K. Rowling Books:"); + System.out.println(chamberOfSecrets); + + System.out.println("Sci-fi Books:"); + System.out.println(dune); + System.out.println(foundation); +} +``` +Program output: +``` +Stephen King Books: +Book{genre=HORROR, author='Stephen King', title='The Shining', publicationDate=1977-01-28} +Book{genre=FANTASY, author='Stephen King', title='The Dark Tower: Gunslinger', publicationDate=1982-06-10} +J.K. Rowling Books: +Book{genre=FANTASY, author='J.K. Rowling', title='Harry Potter and the Chamber of Secrets', publicationDate=1998-07-02} +Sci-fi Books: +Book{genre=SCI_FI, author='Frank Herbert', title='Dune', publicationDate=1965-08-01} +Book{genre=SCI_FI, author='Isaac Asimov', title='Foundation', publicationDate=1942-05-01} +``` ## Class diagram ![currying-uml](./etc/currying.urm.png) From c78a5763d7218eeab9ea5091d479b75d16868650 Mon Sep 17 00:00:00 2001 From: Hugo Kat Date: Wed, 19 Oct 2022 18:09:52 +1100 Subject: [PATCH 09/30] #1842 Replaced prints with LOGGER --- .../main/java/com/iluwatar/currying/App.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/App.java b/currying/src/main/java/com/iluwatar/currying/App.java index 2f6554b98447..8a6ee9131e52 100644 --- a/currying/src/main/java/com/iluwatar/currying/App.java +++ b/currying/src/main/java/com/iluwatar/currying/App.java @@ -25,10 +25,12 @@ package com.iluwatar.currying; import java.time.LocalDate; +import lombok.extern.slf4j.Slf4j; /** * This is a Javadoc comment to pass the style check. */ +@Slf4j public class App { /** * This is a Javadoc comment to pass the style check. @@ -62,15 +64,15 @@ public static void main(String[] args) { .withTitle("Foundation") .withPublicationDate(LocalDate.of(1942, 5, 1)); - System.out.println("Stephen King Books:"); - System.out.println(shining); - System.out.println(darkTower); + LOGGER.info("Stephen King Books:"); + LOGGER.info(shining.toString()); + LOGGER.info(darkTower.toString()); - System.out.println("J.K. Rowling Books:"); - System.out.println(chamberOfSecrets); + LOGGER.info("J.K. Rowling Books:"); + LOGGER.info(chamberOfSecrets.toString()); - System.out.println("Sci-fi Books:"); - System.out.println(dune); - System.out.println(foundation); + LOGGER.info("Sci-fi Books:"); + LOGGER.info(dune.toString()); + LOGGER.info(foundation.toString()); } } \ No newline at end of file From 9af432a8e67bcfd824250de2fd87c930266b08f2 Mon Sep 17 00:00:00 2001 From: Hugo Kat Date: Thu, 20 Oct 2022 11:56:09 +1100 Subject: [PATCH 10/30] #1842 Fixed typo in README --- currying/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/currying/README.md b/currying/README.md index 2d9596467835..861f0c54c77d 100644 --- a/currying/README.md +++ b/currying/README.md @@ -169,7 +169,7 @@ Pros * Currying allows for partial application, which can be used to create specialised functions concisely. Cons -* The order of the parameters in a curried function is important since we want to take advantage of partial application. It is best to input the most general parameters first and input specific parameters lasts. +* The order of the parameters in a curried function is important since we want to take advantage of partial application. It is best to input the most general parameters first and input specific parameters last. * As shown in the programmatic example above, curried functions with several parameters have a cumbersome type signature (in Java). ## Credits From 14c328cd04182633d5496673c2e85c5e68b345cb Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 11:59:29 +1100 Subject: [PATCH 11/30] #1842 Testing commit account --- currying/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/currying/README.md b/currying/README.md index 861f0c54c77d..63bf6c8b68b7 100644 --- a/currying/README.md +++ b/currying/README.md @@ -13,7 +13,7 @@ tags: Currying ## Intent -WHAT IS CURRYING TRYING TO ACHIEVE? +WHAT IS CURRYING TRYING TO ACHIEVE? Test ## Explanation Real-world example From dee1baa827f73cb3ec005c6f310214eea34636e1 Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 14:20:33 +1100 Subject: [PATCH 12/30] #1842 Adding documentation to App class --- currying/src/main/java/com/iluwatar/currying/App.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/App.java b/currying/src/main/java/com/iluwatar/currying/App.java index 8a6ee9131e52..19ad516a2bb5 100644 --- a/currying/src/main/java/com/iluwatar/currying/App.java +++ b/currying/src/main/java/com/iluwatar/currying/App.java @@ -28,14 +28,21 @@ import lombok.extern.slf4j.Slf4j; /** -* This is a Javadoc comment to pass the style check. +* Currying decomposes a function with multiple arguments in multiple functions that +* take a single argument. A curried function which has only been passed some of its +* arguments is called a partial application. Partial application is useful since it can +* be used to create specialised functions in a concise way. +* +*

In this example, a librarian uses a curried book builder function create books belonging to +* desired genres and written by specific authors. */ @Slf4j public class App { /** - * This is a Javadoc comment to pass the style check. + * Main entry point of the program. */ public static void main(String[] args) { + LOGGER.info("Librarian begins their work."); // Defining genre book functions Book.AddAuthor fantasyBookFunc = Book.builder().withGenre(Genre.FANTASY); Book.AddAuthor horrorBookFunc = Book.builder().withGenre(Genre.HORROR); From 31621f4a964fcc27d877fb5cb8e57ce88195652d Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 14:36:35 +1100 Subject: [PATCH 13/30] #1842 Improved documentation --- currying/README.md | 83 ++++++++++--------- .../main/java/com/iluwatar/currying/App.java | 1 + .../main/java/com/iluwatar/currying/Book.java | 6 +- 3 files changed, 47 insertions(+), 43 deletions(-) diff --git a/currying/README.md b/currying/README.md index 63bf6c8b68b7..65d44540bac1 100644 --- a/currying/README.md +++ b/currying/README.md @@ -72,7 +72,7 @@ Note that the order of the parameters is important. `genre` must come before `au ```java Function>> fantasyBookFunc = Book.BOOK_CREATOR.apply(Genre.FANTASY); ``` -Unfortunately, the type signature of `BOOK_CREATOR` and `fantasyBookFunc` are difficult to read and understand. We can improve this by using the [builder pattern](https://java-design-patterns.com/patterns/builder/) and functional interfaces. +Unfortunately, the type signature of `BOOK_CREATOR` and `fantasyBookFunc` are difficult to read and understand. We can improve this by using the [builder pattern](https://java-design-patterns.com/patterns/builder/) and [functional interfaces](https://www.geeksforgeeks.org/functional-interfaces-java/#:~:text=A%20functional%20interface%20is%20an,any%20number%20of%20default%20methods). ```java public static AddGenre builder() { return genre @@ -98,51 +98,54 @@ public interface AddPublicationDate { Book withPublicationDate(LocalDate publicationDate); } ``` -The semantics of the `builder` function can easily be understood. The `builder` function returns a functional interface `AddGenre`, which adds the genre to the book. Similarity, the `AddGenre` functional interface returns another functional interface `AddTitle`, which adds the title to the book and so on, until the `AddPublicationDate` functional interface returns a `Book`. The below example demonstrates how partial application can be used with the `builder` function to create specialised book builder functions. +The semantics of the `builder` function can easily be understood. The `builder` function returns a function `AddGenre`, which adds the genre to the book. Similarity, the `AddGenre` function returns another function `AddTitle`, which adds the title to the book and so on, until the `AddPublicationDate` function returns a `Book`. The below example demonstrates how partial application can be used with the `builder` function to create specialised book builder functions. ```java public static void main(String[] args) { - // Defining genre book functions - Book.AddAuthor fantasyBookFunc = Book.builder().withGenre(Genre.FANTASY); - Book.AddAuthor horrorBookFunc = Book.builder().withGenre(Genre.HORROR); - Book.AddAuthor scifiBookFunc = Book.builder().withGenre(Genre.SCI_FI); - - // Defining author book functions - Book.AddTitle kingFantasyBooksFunc = fantasyBookFunc.withAuthor("Stephen King"); - Book.AddTitle kingHorrorBooksFunc = horrorBookFunc.withAuthor("Stephen King"); - Book.AddTitle rowlingFantasyBooksFunc = fantasyBookFunc.withAuthor("J.K. Rowling"); - - // Creates books by Stephen King (horror and fantasy genres) - Book shining = kingHorrorBooksFunc.withTitle("The Shining") - .withPublicationDate(LocalDate.of(1977, 1, 28)); - Book darkTower = kingFantasyBooksFunc.withTitle("The Dark Tower: Gunslinger") - .withPublicationDate(LocalDate.of(1982, 6, 10)); - - // Creates fantasy books by J.K. Rowling - Book chamberOfSecrets = rowlingFantasyBooksFunc.withTitle("Harry Potter and the Chamber of Secrets") - .withPublicationDate(LocalDate.of(1998, 7, 2)); - - // Create sci-fi books - Book dune = scifiBookFunc.withAuthor("Frank Herbert") - .withTitle("Dune") - .withPublicationDate(LocalDate.of(1965, 8, 1)); - Book foundation = scifiBookFunc.withAuthor("Isaac Asimov") - .withTitle("Foundation") - .withPublicationDate(LocalDate.of(1942, 5, 1)); - - System.out.println("Stephen King Books:"); - System.out.println(shining); - System.out.println(darkTower); - - System.out.println("J.K. Rowling Books:"); - System.out.println(chamberOfSecrets); - - System.out.println("Sci-fi Books:"); - System.out.println(dune); - System.out.println(foundation); + LOGGER.info("Librarian begins their work."); + + // Defining genre book functions + Book.AddAuthor fantasyBookFunc = Book.builder().withGenre(Genre.FANTASY); + Book.AddAuthor horrorBookFunc = Book.builder().withGenre(Genre.HORROR); + Book.AddAuthor scifiBookFunc = Book.builder().withGenre(Genre.SCI_FI); + + // Defining author book functions + Book.AddTitle kingFantasyBooksFunc = fantasyBookFunc.withAuthor("Stephen King"); + Book.AddTitle kingHorrorBooksFunc = horrorBookFunc.withAuthor("Stephen King"); + Book.AddTitle rowlingFantasyBooksFunc = fantasyBookFunc.withAuthor("J.K. Rowling"); + + // Creates books by Stephen King (horror and fantasy genres) + Book shining = kingHorrorBooksFunc.withTitle("The Shining") + .withPublicationDate(LocalDate.of(1977, 1, 28)); + Book darkTower = kingFantasyBooksFunc.withTitle("The Dark Tower: Gunslinger") + .withPublicationDate(LocalDate.of(1982, 6, 10)); + + // Creates fantasy books by J.K. Rowling + Book chamberOfSecrets = rowlingFantasyBooksFunc.withTitle("Harry Potter and the Chamber of Secrets") + .withPublicationDate(LocalDate.of(1998, 7, 2)); + + // Create sci-fi books + Book dune = scifiBookFunc.withAuthor("Frank Herbert") + .withTitle("Dune") + .withPublicationDate(LocalDate.of(1965, 8, 1)); + Book foundation = scifiBookFunc.withAuthor("Isaac Asimov") + .withTitle("Foundation") + .withPublicationDate(LocalDate.of(1942, 5, 1)); + + LOGGER.info("Stephen King Books:"); + LOGGER.info(shining.toString()); + LOGGER.info(darkTower.toString()); + + LOGGER.info("J.K. Rowling Books:"); + LOGGER.info(chamberOfSecrets.toString()); + + LOGGER.info("Sci-fi Books:"); + LOGGER.info(dune.toString()); + LOGGER.info(foundation.toString()); } ``` Program output: ``` +Librarian begins their work. Stephen King Books: Book{genre=HORROR, author='Stephen King', title='The Shining', publicationDate=1977-01-28} Book{genre=FANTASY, author='Stephen King', title='The Dark Tower: Gunslinger', publicationDate=1982-06-10} diff --git a/currying/src/main/java/com/iluwatar/currying/App.java b/currying/src/main/java/com/iluwatar/currying/App.java index 19ad516a2bb5..501bb8b7afc7 100644 --- a/currying/src/main/java/com/iluwatar/currying/App.java +++ b/currying/src/main/java/com/iluwatar/currying/App.java @@ -43,6 +43,7 @@ public class App { */ public static void main(String[] args) { LOGGER.info("Librarian begins their work."); + // Defining genre book functions Book.AddAuthor fantasyBookFunc = Book.builder().withGenre(Genre.FANTASY); Book.AddAuthor horrorBookFunc = Book.builder().withGenre(Genre.HORROR); diff --git a/currying/src/main/java/com/iluwatar/currying/Book.java b/currying/src/main/java/com/iluwatar/currying/Book.java index 833c5d4cfacf..262993fcaf90 100644 --- a/currying/src/main/java/com/iluwatar/currying/Book.java +++ b/currying/src/main/java/com/iluwatar/currying/Book.java @@ -29,7 +29,7 @@ import java.util.function.Function; /** - * This is a Javadoc comment to pass the style check. + * Book class. */ public class Book { private final Genre genre; @@ -81,8 +81,8 @@ public String toString() { -> new Book(genre, author, title, publicationDate); /** - * Implements the builder pattern using functional interfaces to create a more readable - * book creator function. + * Implements the builder pattern using functional interfaces to create a more readable book + * creator function. This function is equivalent to the BOOK_CREATOR function. */ public static AddGenre builder() { return genre From 56f8c9ffb5b11f80ef437ac23be48e4e44adbf0c Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 14:43:59 +1100 Subject: [PATCH 14/30] #1842 Added documentation to AppTest --- currying/src/test/java/com/iluwatar/currying/AppTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/currying/src/test/java/com/iluwatar/currying/AppTest.java b/currying/src/test/java/com/iluwatar/currying/AppTest.java index 450597922dbf..d0c2d88afe7f 100644 --- a/currying/src/test/java/com/iluwatar/currying/AppTest.java +++ b/currying/src/test/java/com/iluwatar/currying/AppTest.java @@ -28,6 +28,9 @@ import org.junit.jupiter.api.Test; +/** + * Tests that the App can be run without throwing any exceptions. + */ public class AppTest { @Test void executesWithoutExceptions() { From efc192a00d3e28ab1996ae87a0873ed0921215ff Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 14:50:38 +1100 Subject: [PATCH 15/30] #1842 Fixing latex formating issue --- currying/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/currying/README.md b/currying/README.md index 65d44540bac1..4622a0876042 100644 --- a/currying/README.md +++ b/currying/README.md @@ -26,8 +26,8 @@ In plain words Wikipedia says > Currying is the technique of converting a function that takes multiple arguments into a sequence of functions that -> each take a single argument. Given a function $f:(X \times Y) \rightarrow Z$, currying constructs a new function $h:X \rightarrow -> (Y\rightarrow Z)$. $h$ takes an argument from $X$ and returns a function which maps $Y$ to $Z$. Hence, +> each take a single argument. Given a function $f:(X \times Y) \rightarrow Z$, currying constructs a new function +> $h:X \rightarrow (Y\rightarrow Z)$. $h$ takes an argument from $X$ and returns a function which maps $Y$ to $Z$. Hence, > $h(x)(y) = f(x, y)$. Programmatic example From 07d0cc6fb3e52e30b73e6e8c0da18917e8d15380 Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 15:33:48 +1100 Subject: [PATCH 16/30] #1842 Improving the intent description --- currying/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/currying/README.md b/currying/README.md index 4622a0876042..9082cd689e00 100644 --- a/currying/README.md +++ b/currying/README.md @@ -13,7 +13,9 @@ tags: Currying ## Intent -WHAT IS CURRYING TRYING TO ACHIEVE? Test +Currying decomposes a function that takes multiple arguments into a sequence of functions that each take a single argument. +The parameters of a curried function can be initialised to create a new function with lower arity to perform a more specialised +task. ## Explanation Real-world example From f2b314aa4867b72e384d1fec139c237c78b34eb4 Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 15:37:10 +1100 Subject: [PATCH 17/30] #1842 Removed override methods from the UML diagram for clarity --- currying/etc/currying.urm.png | Bin 66753 -> 41636 bytes currying/etc/currying.urm.puml | 6 ------ 2 files changed, 6 deletions(-) diff --git a/currying/etc/currying.urm.png b/currying/etc/currying.urm.png index b3b6141fd514d1e4dc9198a9ec209f2babf2b93e..c672bdde37cf1a066ef1a006599576a89ee622f4 100644 GIT binary patch literal 41636 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 literal 66753 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%0A3etyUgP5-ST_7kq%U z5o!p|AYq`vOiuAI6RDFtzZT^iMiIr62>Y7Ae*lsu?Z^`3O=y?ujvrOn?E**V$$eR= zAL{}gW2lIe584wbtD;ZsffQ_t7%0fjH4oyf$L3-pO0-{h0x3sQpOdek`O1tp)a>nQ zlybzfqF-B2BW=alqI>AvAcN0`n zP-&nRy#Q0|CowD-6d_Pfjs!W=LqdRLU?Hcg;{u|9H_58IaGx$USZI`2m1$D~`{q8$ zU_ztSa1Al|Q%36c_!COnp}Qsu7I4{)#EMfMi&pIJu+67UJ3JX43TN|tTv*Jcq*21@ zxgoRmLZm}ZPOXylp&$BjcLLCd^4dm784;izR#sLMy~(Hg)Lx+&&{&pH+pGKOv23^e z#deF)f(%#G$bjac!Ah2&qK8mKndrVAI+% z>?8i=khUjLa+<>e90EI(l%Dg)xasI>Vyg(f%@`+Rc4lH%ackjtB??>a=IhJ+MQREU&ALU$I8ylDT ziG+7L7Hl~1QlxJ91v;@3}CC88|%tL`S+pTrH$Iw_ggxLE{lkU{uHpR@Otee z8K8dBckgn$Vt3Z#XZh(rZs!gsog$&aGxaRV%HuAlmZ7CI713@zN+XQx)z2ApD4Xws z3bEBDa3Sf$4PFs!WblxFMZQUW8%PG>!Dd%{?Ixp8EF_`tt&i3&B#iINoH{A~36)l1 z?HQxTprYb0v5&On9`xIJ?}fDOIkN_3V%hfVxjBa0N>pEKuyssGOO)o|MjX!qim<=i zhyUWTz!duqXuO2xsNu6+rmMWoK^;PKg%RE70BkQ^b1Gz0rw{Pi%gs?JusL}qVk3^y zO#u!^*HosQ2Zs)p&j2DEJ$$|v6v`o~>8iw&{-*C3M?;^OZfP9;*Ppy-;JRae7}GI; zD_i#p-bhLR6pZJRp|wbj9mI7~xE{}__hB`lt<@YRZ#YEn74P2(ZzMxoR)8~78})++ znaI*NK6~+WD&`pHUz*kPW);mD^(|L#Iv}_*kt)xC "-genre" Genre From 642017b96ed5e0522fa90f03543ee8e7e48919d0 Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 15:40:29 +1100 Subject: [PATCH 18/30] #1842 Renamed the SCI_FI enum --- currying/src/main/java/com/iluwatar/currying/App.java | 2 +- currying/src/main/java/com/iluwatar/currying/Genre.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/App.java b/currying/src/main/java/com/iluwatar/currying/App.java index 501bb8b7afc7..d3ca262b56c4 100644 --- a/currying/src/main/java/com/iluwatar/currying/App.java +++ b/currying/src/main/java/com/iluwatar/currying/App.java @@ -47,7 +47,7 @@ public static void main(String[] args) { // Defining genre book functions Book.AddAuthor fantasyBookFunc = Book.builder().withGenre(Genre.FANTASY); Book.AddAuthor horrorBookFunc = Book.builder().withGenre(Genre.HORROR); - Book.AddAuthor scifiBookFunc = Book.builder().withGenre(Genre.SCI_FI); + Book.AddAuthor scifiBookFunc = Book.builder().withGenre(Genre.SCIFI); // Defining author book functions Book.AddTitle kingFantasyBooksFunc = fantasyBookFunc.withAuthor("Stephen King"); diff --git a/currying/src/main/java/com/iluwatar/currying/Genre.java b/currying/src/main/java/com/iluwatar/currying/Genre.java index 439f24703ac0..9b6560b1008d 100644 --- a/currying/src/main/java/com/iluwatar/currying/Genre.java +++ b/currying/src/main/java/com/iluwatar/currying/Genre.java @@ -30,7 +30,7 @@ public enum Genre { FANTASY, HORROR, - SCI_FI; + SCIFI; /** * This is a Javadoc comment to pass the style check. From 5f863b74d805e93c3895328cd29d826f82ef3bf0 Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 15:41:13 +1100 Subject: [PATCH 19/30] #1842 Updated the currying pom.xml --- currying/pom.xml | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/currying/pom.xml b/currying/pom.xml index 96952810abc5..b0bd24dbc641 100644 --- a/currying/pom.xml +++ b/currying/pom.xml @@ -27,12 +27,11 @@ --> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - java-design-patterns com.iluwatar + java-design-patterns 1.26.0-SNAPSHOT currying @@ -45,21 +44,14 @@ org.junit.jupiter - junit-jupiter - 5.7.1 + junit-jupiter-engine test - - - 15 - 15 - - + in parent pom and specifying the class having main method --> org.apache.maven.plugins maven-assembly-plugin @@ -77,5 +69,4 @@ - \ No newline at end of file From edbbb77a7b40856161fc525491a0895f11b8a17c Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 15:54:40 +1100 Subject: [PATCH 20/30] #1842 Removed unneeded comment --- currying/src/main/java/com/iluwatar/currying/Genre.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/Genre.java b/currying/src/main/java/com/iluwatar/currying/Genre.java index 9b6560b1008d..4b830b3fad4d 100644 --- a/currying/src/main/java/com/iluwatar/currying/Genre.java +++ b/currying/src/main/java/com/iluwatar/currying/Genre.java @@ -32,9 +32,6 @@ public enum Genre { HORROR, SCIFI; - /** - * This is a Javadoc comment to pass the style check. - */ @Override public String toString() { return super.toString(); From 9cca9bfde141609a203c423d36f4d44cc5160fd8 Mon Sep 17 00:00:00 2001 From: hkattt Date: Thu, 20 Oct 2022 18:22:13 +1100 Subject: [PATCH 21/30] #1842 Improving documentation and README --- currying/README.md | 6 +++--- currying/src/main/java/com/iluwatar/currying/Book.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/currying/README.md b/currying/README.md index 9082cd689e00..51d3ba4e31a2 100644 --- a/currying/README.md +++ b/currying/README.md @@ -6,7 +6,7 @@ permalink: /patterns/currying/ categories: Functional language: en tags: - - FIGURE OUT WHAT TAG + - Decoupling --- ## Name / classification @@ -14,8 +14,8 @@ Currying ## Intent Currying decomposes a function that takes multiple arguments into a sequence of functions that each take a single argument. -The parameters of a curried function can be initialised to create a new function with lower arity to perform a more specialised -task. +Curried functions are useful since they can be used to create new functions with lower arity to perform more specialised tasks +in a concise and readable manner. This is done via partial application. ## Explanation Real-world example diff --git a/currying/src/main/java/com/iluwatar/currying/Book.java b/currying/src/main/java/com/iluwatar/currying/Book.java index 262993fcaf90..e0329d036e0b 100644 --- a/currying/src/main/java/com/iluwatar/currying/Book.java +++ b/currying/src/main/java/com/iluwatar/currying/Book.java @@ -71,7 +71,7 @@ public String toString() { } /** - * Curried unary book create functions. + * Curried book builder/creator function. */ static Function>>> BOOK_CREATOR = genre From 3555fac23bfa6162a66b51b40a9970d392d1ced1 Mon Sep 17 00:00:00 2001 From: hkattt Date: Wed, 26 Oct 2022 11:06:19 +1100 Subject: [PATCH 22/30] Added review changes. --- currying/README.md | 13 ++++++++++++- currying/pom.xml | 6 ------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/currying/README.md b/currying/README.md index 51d3ba4e31a2..a41455e9d68a 100644 --- a/currying/README.md +++ b/currying/README.md @@ -100,7 +100,15 @@ public interface AddPublicationDate { Book withPublicationDate(LocalDate publicationDate); } ``` -The semantics of the `builder` function can easily be understood. The `builder` function returns a function `AddGenre`, which adds the genre to the book. Similarity, the `AddGenre` function returns another function `AddTitle`, which adds the title to the book and so on, until the `AddPublicationDate` function returns a `Book`. The below example demonstrates how partial application can be used with the `builder` function to create specialised book builder functions. +The semantics of the `builder` function can easily be understood. The `builder` function returns a function `AddGenre`, which adds the genre to the book. Similarity, the `AddGenre` function returns another function `AddTitle`, which adds the title to the book and so on, until the `AddPublicationDate` function returns a `Book`. +For example, we could create a `Book` as follows: +```java +Book book = Book.builder().withGenre(Genre.FANTAST) + .withAuthor("Author") + .withTitle("Title") + .withPublicationDate(LocalDate.of(2000, 7, 2)); +``` +The below example demonstrates how partial application can be used with the `builder` function to create specialised book builder functions. ```java public static void main(String[] args) { LOGGER.info("Librarian begins their work."); @@ -177,6 +185,9 @@ Cons * The order of the parameters in a curried function is important since we want to take advantage of partial application. It is best to input the most general parameters first and input specific parameters last. * As shown in the programmatic example above, curried functions with several parameters have a cumbersome type signature (in Java). +## Related patterns +* [Builder patter](https://java-design-patterns.com/patterns/builder/) + ## Credits * [Currying in Java](https://www.baeldung.com/java-currying) * [What Is Currying in Programming](https://towardsdatascience.com/what-is-currying-in-programming-56fd57103431#:~:text=Currying%20is%20helpful%20when%20you,concise%2C%20and%20more%20readable%20solution.) diff --git a/currying/pom.xml b/currying/pom.xml index b0bd24dbc641..5b5385c45a59 100644 --- a/currying/pom.xml +++ b/currying/pom.xml @@ -36,12 +36,6 @@ currying - - junit - junit - 4.12 - test - org.junit.jupiter junit-jupiter-engine From 3e1b896f5130bfb59c8b18afc90a2dcffdd9b753 Mon Sep 17 00:00:00 2001 From: hkattt Date: Wed, 16 Nov 2022 09:45:14 +1100 Subject: [PATCH 23/30] Fixing build issues and added javadoc comments to functional interfaces. --- .../src/main/java/com/iluwatar/currying/Book.java | 12 ++++++++++++ .../java/com/iluwatar/currying/BookCurryingTest.java | 6 +++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/Book.java b/currying/src/main/java/com/iluwatar/currying/Book.java index e0329d036e0b..29d4422f249d 100644 --- a/currying/src/main/java/com/iluwatar/currying/Book.java +++ b/currying/src/main/java/com/iluwatar/currying/Book.java @@ -92,18 +92,30 @@ public static AddGenre builder() { -> new Book(genre, author, title, publicationDate); } + /** + * Functional interface which adds the genre to a book. + */ public interface AddGenre { Book.AddAuthor withGenre(Genre genre); } + /** + * Functional interface which adds the author to a book. + */ public interface AddAuthor { Book.AddTitle withAuthor(String author); } + /** + * Functional interface which adds the title to a book. + */ public interface AddTitle { Book.AddPublicationDate withTitle(String title); } + /** + * Functional interface which adds the publication date to a book. + */ public interface AddPublicationDate { Book withPublicationDate(LocalDate publicationDate); } diff --git a/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java b/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java index b5d479b9950d..6f0ddbe2b5cf 100644 --- a/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java +++ b/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java @@ -26,8 +26,8 @@ import static org.junit.jupiter.api.Assertions.*; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import java.time.LocalDate; @@ -37,7 +37,7 @@ public class BookCurryingTest { private static Book expectedBook; - @BeforeClass + @BeforeAll public static void initialiseBook() { expectedBook = new Book(Genre.FANTASY, "Dave", From 51065b64d7f971f2de645962d88279d58c66afe1 Mon Sep 17 00:00:00 2001 From: hkattt Date: Wed, 16 Nov 2022 10:20:31 +1100 Subject: [PATCH 24/30] Removing code smells --- currying/src/main/java/com/iluwatar/currying/Book.java | 10 +++++----- .../src/test/java/com/iluwatar/currying/AppTest.java | 2 +- .../java/com/iluwatar/currying/BookCurryingTest.java | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/Book.java b/currying/src/main/java/com/iluwatar/currying/Book.java index 29d4422f249d..7f4044151d60 100644 --- a/currying/src/main/java/com/iluwatar/currying/Book.java +++ b/currying/src/main/java/com/iluwatar/currying/Book.java @@ -74,11 +74,11 @@ public String toString() { * Curried book builder/creator function. */ static Function>>> BOOK_CREATOR - = genre - -> author - -> title - -> publicationDate - -> new Book(genre, author, title, publicationDate); + = bookGenre + -> bookAuthor + -> bookTitle + -> bookPublicationDate + -> new Book(bookGenre, bookAuthor, bookTitle, bookPublicationDate); /** * Implements the builder pattern using functional interfaces to create a more readable book diff --git a/currying/src/test/java/com/iluwatar/currying/AppTest.java b/currying/src/test/java/com/iluwatar/currying/AppTest.java index d0c2d88afe7f..83fd99363e52 100644 --- a/currying/src/test/java/com/iluwatar/currying/AppTest.java +++ b/currying/src/test/java/com/iluwatar/currying/AppTest.java @@ -31,7 +31,7 @@ /** * Tests that the App can be run without throwing any exceptions. */ -public class AppTest { +class AppTest { @Test void executesWithoutExceptions() { assertDoesNotThrow(() -> App.main(new String[]{})); diff --git a/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java b/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java index 6f0ddbe2b5cf..a2ae42b25c32 100644 --- a/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java +++ b/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java @@ -34,7 +34,7 @@ /** * Unit tests for the Book class */ -public class BookCurryingTest { +class BookCurryingTest { private static Book expectedBook; @BeforeAll @@ -49,7 +49,7 @@ public static void initialiseBook() { * Tests that the expected book can be created via curried functions */ @Test - public void createsExpectedBook() { + void createsExpectedBook() { Book curriedBook = Book.builder() .withGenre(Genre.FANTASY) .withAuthor("Dave") @@ -63,7 +63,7 @@ public void createsExpectedBook() { * Tests that an intermediate curried function can be used to create the expected book */ @Test - public void functionCreatesExpectedBook() { + void functionCreatesExpectedBook() { Book.AddTitle daveFantasyBookFunc = Book.builder() .withGenre(Genre.FANTASY) .withAuthor("Dave"); From ac25b8562bdeb4ce35c090697e7924942f1919b9 Mon Sep 17 00:00:00 2001 From: hkattt Date: Mon, 28 Nov 2022 11:49:34 +1100 Subject: [PATCH 25/30] Removed unnecessary toString method --- currying/src/main/java/com/iluwatar/currying/Genre.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/Genre.java b/currying/src/main/java/com/iluwatar/currying/Genre.java index 4b830b3fad4d..58e639f4ce3c 100644 --- a/currying/src/main/java/com/iluwatar/currying/Genre.java +++ b/currying/src/main/java/com/iluwatar/currying/Genre.java @@ -31,9 +31,4 @@ public enum Genre { FANTASY, HORROR, SCIFI; - - @Override - public String toString() { - return super.toString(); - } } From 63873d8f8915e99a7c6387089b4dbf9b860e7b9a Mon Sep 17 00:00:00 2001 From: hkattt Date: Mon, 28 Nov 2022 11:50:20 +1100 Subject: [PATCH 26/30] Using lombok to reduce boiler plate. --- currying/src/main/java/com/iluwatar/currying/Book.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/currying/src/main/java/com/iluwatar/currying/Book.java b/currying/src/main/java/com/iluwatar/currying/Book.java index 7f4044151d60..7477eae79055 100644 --- a/currying/src/main/java/com/iluwatar/currying/Book.java +++ b/currying/src/main/java/com/iluwatar/currying/Book.java @@ -27,23 +27,18 @@ import java.time.LocalDate; import java.util.Objects; import java.util.function.Function; +import lombok.AllArgsConstructor; /** * Book class. */ +@AllArgsConstructor public class Book { private final Genre genre; private final String author; private final String title; private final LocalDate publicationDate; - Book(Genre genre, String author, String title, LocalDate publicationDate) { - this.genre = genre; - this.author = author; - this.title = title; - this.publicationDate = publicationDate; - } - @Override public boolean equals(Object o) { if (this == o) { From 5ab60713788e062b280e490d214c32e1b4b573cb Mon Sep 17 00:00:00 2001 From: hkattt Date: Mon, 28 Nov 2022 11:55:33 +1100 Subject: [PATCH 27/30] Fixed frontmatter. --- currying/README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/currying/README.md b/currying/README.md index a41455e9d68a..0d5e953b11d2 100644 --- a/currying/README.md +++ b/currying/README.md @@ -1,12 +1,9 @@ --- -layout: pattern title: Currying -folder: currying -permalink: /patterns/currying/ -categories: Functional +category: Functional language: en -tags: - - Decoupling +tag: +- Decoupling --- ## Name / classification From 74bf9c9bd2599d8aa6d538a0fd9744de252a2adc Mon Sep 17 00:00:00 2001 From: hkattt Date: Tue, 29 Nov 2022 11:36:07 +1100 Subject: [PATCH 28/30] Removing function name code smell --- currying/README.md | 2 +- currying/src/main/java/com/iluwatar/currying/Book.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/currying/README.md b/currying/README.md index 0d5e953b11d2..84fdb8d9bc0d 100644 --- a/currying/README.md +++ b/currying/README.md @@ -60,7 +60,7 @@ Book createBook(Genre genre, String author, String title, LocalDate publicationD ``` However, what if we only wanted to create books from the `FANTASY` genre? We could pass in the `FANTASY` parameter on each method call; however, this is repetitive. We could define a new method specifically for creating `FANTASY` books; however, it is infeasible to create a new method for each book genre. The solution is to create a curried function. ```java -static Function>>> BOOK_CREATOR +static Function>>> book_creator = genre -> author -> title diff --git a/currying/src/main/java/com/iluwatar/currying/Book.java b/currying/src/main/java/com/iluwatar/currying/Book.java index 7477eae79055..f9b7be05138a 100644 --- a/currying/src/main/java/com/iluwatar/currying/Book.java +++ b/currying/src/main/java/com/iluwatar/currying/Book.java @@ -68,7 +68,7 @@ public String toString() { /** * Curried book builder/creator function. */ - static Function>>> BOOK_CREATOR + static Function>>> book_creator = bookGenre -> bookAuthor -> bookTitle From 1cec6a7c888eb9b1b7004d6ff786e0f85eaf9183 Mon Sep 17 00:00:00 2001 From: hkattt Date: Sun, 4 Dec 2022 14:04:08 +1100 Subject: [PATCH 29/30] Fixed README typo --- currying/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/currying/README.md b/currying/README.md index 84fdb8d9bc0d..72e0e89d46df 100644 --- a/currying/README.md +++ b/currying/README.md @@ -69,7 +69,7 @@ static Function>> fantasyBookFunc = Book.BOOK_CREATOR.apply(Genre.FANTASY); +Function>> fantasyBookFunc = Book.book_creator.apply(Genre.FANTASY); ``` Unfortunately, the type signature of `BOOK_CREATOR` and `fantasyBookFunc` are difficult to read and understand. We can improve this by using the [builder pattern](https://java-design-patterns.com/patterns/builder/) and [functional interfaces](https://www.geeksforgeeks.org/functional-interfaces-java/#:~:text=A%20functional%20interface%20is%20an,any%20number%20of%20default%20methods). ```java From 078ea1bbd6e9e1ddc6528b999e855eb10d9d1962 Mon Sep 17 00:00:00 2001 From: hkattt Date: Sun, 4 Dec 2022 14:04:23 +1100 Subject: [PATCH 30/30] Added book_creator test to improve coverage --- .../java/com/iluwatar/currying/BookCurryingTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java b/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java index a2ae42b25c32..437941583618 100644 --- a/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java +++ b/currying/src/test/java/com/iluwatar/currying/BookCurryingTest.java @@ -50,13 +50,20 @@ public static void initialiseBook() { */ @Test void createsExpectedBook() { - Book curriedBook = Book.builder() + Book builderCurriedBook = Book.builder() .withGenre(Genre.FANTASY) .withAuthor("Dave") .withTitle("Into the Night") .withPublicationDate(LocalDate.of(2002, 4, 7)); - assertEquals(expectedBook, curriedBook); + Book funcCurriedBook = Book.book_creator + .apply(Genre.FANTASY) + .apply("Dave") + .apply("Into the Night") + .apply(LocalDate.of(2002, 4, 7)); + + assertEquals(expectedBook, builderCurriedBook); + assertEquals(expectedBook, funcCurriedBook); } /**