From 101ed72e9f97a8f68b5f678854c992dff18d8f9f Mon Sep 17 00:00:00 2001 From: Profpatsch Date: Sun, 8 Sep 2019 14:00:56 +0200 Subject: Init: basic command line abstraction for fish’s complete MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkgs/profpatsch/dhallsh/Argument/toArgList.dhall | 18 ++++ pkgs/profpatsch/dhallsh/Argument/type.dhall | 3 + pkgs/profpatsch/dhallsh/BaseCommand/type.dhall | 1 + pkgs/profpatsch/dhallsh/Command/type.dhall | 1 + pkgs/profpatsch/dhallsh/List/filterOptional.dhall | 23 +++++ pkgs/profpatsch/dhallsh/Option/type.dhall | 1 + .../dhallsh/OptionPrinter/newStyle.dhall | 8 ++ pkgs/profpatsch/dhallsh/OptionPrinter/type.dhall | 1 + pkgs/profpatsch/dhallsh/main.dhall | 101 +++++++++++++++++++++ pkgs/profpatsch/dhallsh/shell.nix | 15 +++ 10 files changed, 172 insertions(+) create mode 100644 pkgs/profpatsch/dhallsh/Argument/toArgList.dhall create mode 100644 pkgs/profpatsch/dhallsh/Argument/type.dhall create mode 100644 pkgs/profpatsch/dhallsh/BaseCommand/type.dhall create mode 100644 pkgs/profpatsch/dhallsh/Command/type.dhall create mode 100644 pkgs/profpatsch/dhallsh/List/filterOptional.dhall create mode 100644 pkgs/profpatsch/dhallsh/Option/type.dhall create mode 100644 pkgs/profpatsch/dhallsh/OptionPrinter/newStyle.dhall create mode 100644 pkgs/profpatsch/dhallsh/OptionPrinter/type.dhall create mode 100644 pkgs/profpatsch/dhallsh/main.dhall create mode 100644 pkgs/profpatsch/dhallsh/shell.nix 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 {}; + simple = import (pkgs.fetchFromGitHub { + owner = "justinwoo"; + repo = "easy-dhall-nix"; + rev = "14f7e929210e928f7b5beade5ef163a62a5d1f4b"; + sha256 = "02f5723rx4q4b53dbckmc7mgzfc1m27xbh1m8rkdhlkklwb5jydp"; + }) {}; + +in + pkgs.mkShell { + name = "dhallsh"; + buildInputs = [ + simple.dhall-simple + ]; + } -- cgit 1.4.1