aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java')
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java
new file mode 100644
index 0000000..c2926aa
--- /dev/null
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/InitFregeTask.java
@@ -0,0 +1,94 @@
+package ch.fhnw.thga.gradleplugins;
+
+import static ch.fhnw.thga.gradleplugins.SharedTaskLogic.NEW_LINE;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import org.gradle.api.DefaultTask;
+import org.gradle.api.file.DirectoryProperty;
+import org.gradle.api.file.RegularFile;
+import org.gradle.api.provider.Property;
+import org.gradle.api.provider.Provider;
+import org.gradle.api.tasks.Input;
+import org.gradle.api.tasks.Internal;
+import org.gradle.api.tasks.OutputDirectory;
+import org.gradle.api.tasks.OutputFile;
+import org.gradle.api.tasks.TaskAction;
+import org.gradle.api.tasks.options.Option;
+
+public abstract class InitFregeTask extends DefaultTask
+{
+ private static final String EMPTY_LINE = "";
+ private static final String HELLO_FREGE_CODE_WITHOUT_MODULE = String.join(NEW_LINE,
+ "import Test.QuickCheck",
+ EMPTY_LINE,
+ "--- compute digit sum",
+ "digitSum :: Integer -> Integer",
+ "digitSum 0 = 0",
+ "digitSum n = (n `rem` 10) + digitSum (n `div` 10)",
+ EMPTY_LINE,
+ "--- compute the reduced digit sum",
+ "reducedDigitSum :: Integer -> Integer",
+ "reducedDigitSum n = if n < 10 then n else reducedDigitSum $ digitSum n",
+ EMPTY_LINE,
+ "main = do",
+ " let answer = digitSum 6666666",
+ " println $",
+ " \"The answer to life, the universe and everything is \"",
+ " ++ show answer",
+ " ++ \".\"",
+ EMPTY_LINE,
+ "{--",
+ " The property 'p_reduced_digit_sum_of_multiple_of_9_is_always_9' checks",
+ " the famous claim that every multiple of 9 number has also the reduced",
+ " digit sum of 9, e.g. 9, 27, 36, ...",
+ "-}",
+ "p_reduced_digit_sum_of_multiple_of_9_is_always_9 = ",
+ " property $ \\(n :: Integer) -> (n > 0) ==> (reducedDigitSum $ 9 * n) == 9"
+ );
+
+ @Input
+ @Option(option = "moduleName",
+ description = "The module name of the default frege file"
+ )
+ public abstract Property<String> getFregeModuleName();
+
+ @Internal
+ final Provider<String> getHelloFregeCode()
+ {
+ return getFregeModuleName()
+ .map(moduleName -> String.format("module %s where", moduleName))
+ .map(firstLine -> String.join(
+ NEW_LINE,
+ firstLine, HELLO_FREGE_CODE_WITHOUT_MODULE
+ ));
+ }
+
+ @Internal
+ final Provider<String> getFregeFilePath()
+ {
+ return getFregeModuleName()
+ .map(moduleName -> moduleName.replace(".", "/"))
+ .map(filePath -> Paths.get(filePath).normalize())
+ .map(filePath -> String.format("%s.fr", filePath.toString()));
+ }
+
+ @OutputDirectory
+ public abstract DirectoryProperty getFregeMainSourceDir();
+
+ @OutputFile
+ final Provider<RegularFile> getHelloFregeFile()
+ {
+ return getFregeMainSourceDir().file(getFregeFilePath());
+ }
+
+ @TaskAction
+ public void writeHelloFregeFile() throws IOException
+ {
+ SharedTaskLogic.writeToFile(
+ getHelloFregeFile().get().getAsFile(),
+ getHelloFregeCode().get()
+ );
+ }
+}