about summary refs log tree commit diff
path: root/pkgs/profpatsch/dhallsh
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2019-09-08 14:00:56 +0200
committerProfpatsch <mail@profpatsch.de>2020-02-24 00:57:55 +0100
commit101ed72e9f97a8f68b5f678854c992dff18d8f9f (patch)
tree2429f587c79b235d6e7e68ae7c3fdccf0945eef9 /pkgs/profpatsch/dhallsh
parent5be00d875782a85d1f03f1dc0631e17f764ded91 (diff)
Init: basic command line abstraction for fish’s complete
Diffstat (limited to 'pkgs/profpatsch/dhallsh')
-rw-r--r--pkgs/profpatsch/dhallsh/Argument/toArgList.dhall18
-rw-r--r--pkgs/profpatsch/dhallsh/Argument/type.dhall3
-rw-r--r--pkgs/profpatsch/dhallsh/BaseCommand/type.dhall1
-rw-r--r--pkgs/profpatsch/dhallsh/Command/type.dhall1
-rw-r--r--pkgs/profpatsch/dhallsh/List/filterOptional.dhall23
-rw-r--r--pkgs/profpatsch/dhallsh/Option/type.dhall1
-rw-r--r--pkgs/profpatsch/dhallsh/OptionPrinter/newStyle.dhall8
-rw-r--r--pkgs/profpatsch/dhallsh/OptionPrinter/type.dhall1
-rw-r--r--pkgs/profpatsch/dhallsh/main.dhall101
-rw-r--r--pkgs/profpatsch/dhallsh/shell.nix15
10 files changed, 172 insertions, 0 deletions
diff --git a/pkgs/profpatsch/dhallsh/Argument/toArgList.dhall b/pkgs/profpatsch/dhallsh/Argument/toArgList.dhall
new file mode 100644
index 00000000..93785c72
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/Argument/toArgList.dhall
@@ -0,0 +1,18 @@
+let OptionPrinter = ../OptionPrinter/type.dhall
+
+let Option = ../Option/type.dhall
+
+let Argument = ../Argument/type.dhall
+
+in    λ(optionPrinter : OptionPrinter)
+	→ λ(a : Argument)
+	→ merge
+	  { Plain =
+		  λ(t : Text) → [ t ]
+	  , Flag =
+		  λ(o : Option) → [ optionPrinter o ]
+	  , Option =
+		  λ(o : { opt : Option, arg : Text }) → [ optionPrinter o.opt, o.arg ]
+	  }
+	  a
+	  : List Text
diff --git a/pkgs/profpatsch/dhallsh/Argument/type.dhall b/pkgs/profpatsch/dhallsh/Argument/type.dhall
new file mode 100644
index 00000000..2e5b6439
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/Argument/type.dhall
@@ -0,0 +1,3 @@
+let Option = ../Option/type.dhall
+
+in  < Plain : Text | Flag : Option | Option : { opt : Option, arg : Text } >
diff --git a/pkgs/profpatsch/dhallsh/BaseCommand/type.dhall b/pkgs/profpatsch/dhallsh/BaseCommand/type.dhall
new file mode 100644
index 00000000..a9994f56
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/BaseCommand/type.dhall
@@ -0,0 +1 @@
+List Text
diff --git a/pkgs/profpatsch/dhallsh/Command/type.dhall b/pkgs/profpatsch/dhallsh/Command/type.dhall
new file mode 100644
index 00000000..0b8d62da
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/Command/type.dhall
@@ -0,0 +1 @@
+λ(arg : Type) → { cmd : Text, args : List arg }
diff --git a/pkgs/profpatsch/dhallsh/List/filterOptional.dhall b/pkgs/profpatsch/dhallsh/List/filterOptional.dhall
new file mode 100644
index 00000000..810599b0
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/List/filterOptional.dhall
@@ -0,0 +1,23 @@
+let filterOptional
+	: ∀(a : Type) → ∀(b : Type) → (a → Optional b) → List a → List b
+	=   λ(a : Type)
+	  → λ(b : Type)
+	  → λ(f : a → Optional b)
+	  → λ(l : List a)
+	  → List/build
+		b
+		(   λ(list : Type)
+		  → λ(cons : b → list → list)
+		  → λ(nil : list)
+		  → List/fold
+			a
+			l
+			list
+			(   λ(x : a)
+			  → λ(xs : list)
+			  → Optional/fold b (f x) list (λ(opt : b) → cons opt xs) xs
+			)
+			nil
+		)
+
+in  filterOptional
diff --git a/pkgs/profpatsch/dhallsh/Option/type.dhall b/pkgs/profpatsch/dhallsh/Option/type.dhall
new file mode 100644
index 00000000..3a282d3a
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/Option/type.dhall
@@ -0,0 +1 @@
+< Long : Text | Short : Text >
diff --git a/pkgs/profpatsch/dhallsh/OptionPrinter/newStyle.dhall b/pkgs/profpatsch/dhallsh/OptionPrinter/newStyle.dhall
new file mode 100644
index 00000000..2a9435d9
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/OptionPrinter/newStyle.dhall
@@ -0,0 +1,8 @@
+let Option = ../Option/type.dhall
+
+let newStyle
+	: Option → Text
+	=   λ(o : Option)
+	  → merge { Long = λ(t : Text) → "--${t}", Short = λ(t : Text) → "-${t}" } o
+
+in  newStyle
diff --git a/pkgs/profpatsch/dhallsh/OptionPrinter/type.dhall b/pkgs/profpatsch/dhallsh/OptionPrinter/type.dhall
new file mode 100644
index 00000000..77d4b8e2
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/OptionPrinter/type.dhall
@@ -0,0 +1 @@
+let Option = ../Option/type.dhall in ∀(o : Option) → Text
diff --git a/pkgs/profpatsch/dhallsh/main.dhall b/pkgs/profpatsch/dhallsh/main.dhall
new file mode 100644
index 00000000..aea25bb1
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/main.dhall
@@ -0,0 +1,101 @@
+let Prelude =
+	  https://prelude.dhall-lang.org/package.dhall sha256:2acd9f8eae045eae46d8288d76b01678c4ac4883a58eadb6be0da00b3ba590cf
+
+let List/filterOptional = ./List/filterOptional.dhall
+
+let Command = ./Command/type.dhall
+
+let Option = ./Option/type.dhall
+
+let Argument = ./Argument/type.dhall
+
+let Complete =
+	  { cmd :
+		  Text
+	  , description :
+		  Text
+	  , condition :
+		  Optional Text
+	  , short-option :
+		  Optional Text
+	  , long-option :
+		  Optional Text
+	  , long-option-old-style :
+		  Optional Text
+	  , arguments :
+		  Optional Text
+	  , keep-order :
+		  Bool
+	  , no-files :
+		  Bool
+	  , require-parameter :
+		  Bool
+	  , wraps :
+		  Optional Text
+	  }
+
+let complete =
+		λ(a : { cmd : Text, description : Text })
+	  → { cmd =
+			a.cmd
+		, description =
+			a.description
+		, condition =
+			None Text
+		, short-option =
+			None Text
+		, long-option =
+			None Text
+		, long-option-old-style =
+			None Text
+		, arguments =
+			None Text
+		, keep-order =
+			False
+		, no-files =
+			False
+		, require-parameter =
+			False
+		, wraps =
+			None Text
+		}
+
+let completeToCommand
+	: Complete → Command Argument
+	= let l = λ(o : Text) → Option.Long o
+
+	  in    λ(c : Complete)
+		  → let long =
+					λ(name : Text)
+				  → λ(content : Text)
+				  → Argument.Option { opt = Option.Long name, arg = content }
+
+			let args =
+					[ Some (long "description" c.description)
+					, Prelude.Optional.map
+					  Text
+					  Argument
+					  (long "condition")
+					  c.condition
+					]
+				  : List (Optional Argument)
+
+			let id = λ(a : Optional Argument) → a
+
+			in  { cmd =
+					c.cmd
+				, args =
+					  List/filterOptional (Optional Argument) Argument id args
+					: List Argument
+				}
+
+in  let foo =
+		  completeToCommand (complete { cmd = "complete", description = "foo" })
+
+	in  [   [ foo.cmd ]
+		  # Prelude.List.concatMap
+			Argument
+			Text
+			(./Argument/toArgList.dhall ./OptionPrinter/newStyle.dhall)
+			foo.args
+		]
diff --git a/pkgs/profpatsch/dhallsh/shell.nix b/pkgs/profpatsch/dhallsh/shell.nix
new file mode 100644
index 00000000..3b5af77b
--- /dev/null
+++ b/pkgs/profpatsch/dhallsh/shell.nix
@@ -0,0 +1,15 @@
+let pkgs = import <nixpkgs> {};
+    simple = import (pkgs.fetchFromGitHub {
+      owner = "justinwoo";
+      repo = "easy-dhall-nix";
+      rev = "14f7e929210e928f7b5beade5ef163a62a5d1f4b";
+      sha256 = "02f5723rx4q4b53dbckmc7mgzfc1m27xbh1m8rkdhlkklwb5jydp";
+    }) {};
+
+in
+  pkgs.mkShell {
+    name = "dhallsh";
+    buildInputs = [
+      simple.dhall-simple
+    ];
+  }