From 1868c94c899941540d8284e2cfad4ad7ecd61730 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Fri, 13 Sep 2019 20:03:23 -0500 Subject: [PATCH] Update dhall-lang This includes the new record selection inspection optimizations. --- dhall-lang | 2 +- lib/dhall/ast.rb | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/dhall-lang b/dhall-lang index affafb9..cf263a1 160000 --- a/dhall-lang +++ b/dhall-lang @@ -1 +1 @@ -Subproject commit affafb9c674c7117e24634ceb5dbdaa1dc8dc0b0 +Subproject commit cf263a128d4e2e25afb3187cb8b243e7e68af9fb diff --git a/lib/dhall/ast.rb b/lib/dhall/ast.rb index 56bdf5c..4ec41c8 100644 --- a/lib/dhall/ast.rb +++ b/lib/dhall/ast.rb @@ -347,6 +347,33 @@ module Dhall [3, OPERATORS.index(self.class), lhs.as_json, rhs.as_json] end + module FetchFromMerge + def fetch_second_record(first, second, selector) + rec = self.class.new( + self.class::FETCH2K => second.slice(selector), + self.class::FETCH1K => first + ).normalize + + if rec.class == self.class + RecordSelection.new(record: rec, selector: selector) + else + rec.fetch(selector) + end + end + + def fetch(selector) + first = public_send(self.class::FETCH1K) + second = public_send(self.class::FETCH2K) + if first.is_a?(Record) + first.fetch(selector) { second.fetch(selector) } + elsif second.is_a?(Record) + fetch_second_record(first, second, selector) + else + super + end + end + end + class Or < Operator; end class And < Operator; end class Equal < Operator; end @@ -355,8 +382,16 @@ module Dhall class Times < Operator; end class TextConcatenate < Operator; end class ListConcatenate < Operator; end - class RecursiveRecordMerge < Operator; end - class RightBiasedRecordMerge < Operator; end + class RecursiveRecordMerge < Operator + FETCH1K = :lhs + FETCH2K = :rhs + include FetchFromMerge + end + class RightBiasedRecordMerge < Operator + FETCH1K = :rhs + FETCH2K = :lhs + include FetchFromMerge + end class RecursiveRecordTypeMerge < Operator; end class ImportFallback < Operator; end @@ -870,6 +905,10 @@ module Dhall end end + def fetch(selector) + record.fetch(selector) + end + def as_json [10, record.as_json, *selectors] end @@ -881,6 +920,10 @@ module Dhall selector Expression end) + def fetch(selector) + record.fetch(selector) + end + def as_json [10, record.as_json, [selector.as_json]] end -- 2.34.2