From b561310f04f8e0b358b39679da096e1d5eb953aa Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 8 May 2019 14:09:04 -0500 Subject: [PATCH] as_dhall for Proc Cannot actually serialize this, but can be useful for passing functions in to Dhall functions, etc. --- lib/dhall/as_dhall.rb | 6 ++++++ lib/dhall/ast.rb | 22 ++++++++++++++++++++++ lib/dhall/normalize.rb | 13 +++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/dhall/as_dhall.rb b/lib/dhall/as_dhall.rb index e40a0a1..f1ff8f1 100644 --- a/lib/dhall/as_dhall.rb +++ b/lib/dhall/as_dhall.rb @@ -220,5 +220,11 @@ module Dhall ) end end + + refine ::Proc do + def as_dhall + FunctionProxy.new(self) + end + end end end diff --git a/lib/dhall/ast.rb b/lib/dhall/ast.rb index 741a7ec..f70cd92 100644 --- a/lib/dhall/ast.rb +++ b/lib/dhall/ast.rb @@ -188,6 +188,28 @@ module Dhall end end + class FunctionProxy < Function + def initialize(callable, curry: true) + @callable = if !curry + callable + elsif callable.respond_to?(:curry) + callable.curry + elsif callable.respond_to?(:to_proc) + callable.to_proc.curry + else + callable.method(:call).to_proc.curry + end + end + + def call(*args, &block) + @callable.call(*args.map { |arg| arg&.as_dhall }, &block).as_dhall + end + + def as_json + raise "Cannot serialize #{self}" + end + end + class Bool < Expression include(ValueSemantics.for_attributes do value Bool() diff --git a/lib/dhall/normalize.rb b/lib/dhall/normalize.rb index ec4df46..0d82b1c 100644 --- a/lib/dhall/normalize.rb +++ b/lib/dhall/normalize.rb @@ -120,9 +120,18 @@ module Dhall end end - class Forall; end + class FunctionProxy + def shift(*) + self + end + + def substitute(*) + raise "Cannot substitute #{self}" + end - class Bool + def normalize + self + end end class Variable -- 2.34.2