M lib/dhall/ast.rb => lib/dhall/ast.rb +216 -69
@@ 21,6 21,14 @@ module Dhall
method(:call).to_proc
end
+ def fetch(k)
+ RecordSelection.new(record: self, selector: k)
+ end
+
+ def slice(*keys)
+ RecordProjection.new(record: self, selectors: keys)
+ end
+
def +(other)
Operator::Plus.new(lhs: self, rhs: other)
end
@@ 71,6 79,33 @@ module Dhall
Operator::Equal.new(lhs: self, rhs: other)
end
end
+
+ def deep_merge(other)
+ case other
+ when EmptyRecord
+ other.deep_merge(self)
+ else
+ Operator::RecursiveRecordMerge.new(lhs: self, rhs: other)
+ end
+ end
+
+ def merge(other)
+ case other
+ when EmptyRecord
+ other.merge(self)
+ else
+ Operator::RightBiasedRecordMerge.new(lhs: self, rhs: other)
+ end
+ end
+
+ def deep_merge_type(other)
+ case other
+ when EmptyRecordType
+ other.deep_merge_type(self)
+ else
+ Operator::RecursiveRecordTypeMerge.new(lhs: self, rhs: other)
+ end
+ end
end
class Application < Expression
@@ 85,14 120,14 @@ module Dhall
end
class Function < Expression
- def initialize(var, type, body)
- @var = var
- @type = type
- @body = body
- end
+ include(ValueSemantics.for_attributes do
+ var ::String
+ type Either(nil, Expression) # nil is not allowed in proper Dhall
+ body Expression
+ end)
def map_subexpressions(&block)
- self.class.new(@var, block[@type], block[@body])
+ with(var: var, type: type.nil? ? nil : block[type], body: block[body])
end
end
@@ 145,9 180,9 @@ module Dhall
class Times < Operator; end
class TextConcatenate < Operator; end
class ListConcatenate < Operator; end
- class RecordMerge < Operator; end
- class RecordOverride < Operator; end
- class RecordTypeMerge < Operator; end
+ class RecursiveRecordMerge < Operator; end
+ class RightBiasedRecordMerge < Operator; end
+ class RecursiveRecordTypeMerge < Operator; end
class ImportFallback < Operator; end
end
@@ 257,14 292,18 @@ module Dhall
end
class Merge < Expression
- def initialize(record, input, type)
- @record = record
- @input = input
- @type = type
- end
+ include(ValueSemantics.for_attributes do
+ record Expression
+ input Expression
+ type Either(Expression, nil)
+ end)
def map_subexpressions(&block)
- self.class.new(block[@record], block[@input], block[@type])
+ with(
+ record: block[record],
+ input: block[input],
+ type: type.nil? ? nil : block[type]
+ )
end
end
@@ 272,19 311,39 @@ module Dhall
attr_reader :record
def initialize(record)
+ raise ArgumentError, "You meant EmptyRecordType?" if record.empty?
@record = record
end
def map_subexpressions(&block)
- self.class.new(
- Hash[*@record.map { |k, v| [k, block[v]] }],
- block[@input],
- block[@type]
- )
+ self.class.new(Hash[*@record.map { |k, v| [k, block[v]] }])
+ end
+
+ def deep_merge_type(other)
+ return super unless other.is_a?(RecordType)
+ self.class.new(Hash[record.merge(other.record) { |_, v1, v2|
+ v1.deep_merge_type(v2)
+ }.sort])
+ end
+
+ def ==(other)
+ other.respond_to?(:record) && record.to_a == other.record.to_a
end
def eql?(other)
- record == other.record
+ self == other
+ end
+ end
+
+ class EmptyRecordType < Expression
+ include ValueSemantics.for_attributes { }
+
+ def map_subexpressions
+ self
+ end
+
+ def deep_merge_type(other)
+ other
end
end
@@ 292,6 351,7 @@ module Dhall
attr_reader :record
def initialize(record)
+ raise ArgumentError, "You meant EmptyRecord?" if record.empty?
@record = record
end
@@ 299,63 359,139 @@ module Dhall
self.class.new(Hash[*@record.map { |k, v| [k, block[v]] }])
end
+ def fetch(k, default=nil, &block)
+ record.fetch(k, *default, &block)
+ end
+
+ def slice(*keys)
+ if record.respond_to?(:slice)
+ self.class.new(record.slice(*keys))
+ else
+ self.class.new(record.select { |k, _| keys.include?(k) })
+ end
+ end
+
+ def deep_merge(other)
+ return super unless other.is_a?(Record)
+ self.class.new(Hash[record.merge(other.record) { |_, v1, v2|
+ v1.deep_merge(v2)
+ }.sort])
+ end
+
+ def merge(other)
+ return super unless other.is_a?(Record)
+ self.class.new(Hash[record.merge(other.record).sort])
+ end
+
+ def ==(other)
+ other.respond_to?(:record) && record.to_a == other.record.to_a
+ end
+
def eql?(other)
- record == other.record
+ self == other
end
end
- class RecordFieldAccess < Expression
- def initialize(record, field)
- raise TypeError, "field must be a String" unless field.is_a?(String)
+ class EmptyRecord < Expression
+ include ValueSemantics.for_attributes { }
- @record = record
- @field = field
+ def map_subexpressions
+ self
+ end
+
+ def fetch(k, default=nil, &block)
+ {}.fetch(k, *default, &block)
+ end
+
+ def slice(*)
+ self
+ end
+
+ def deep_merge(other)
+ other
end
+ def merge(other)
+ other
+ end
+ end
+
+ class RecordSelection < Expression
+ include(ValueSemantics.for_attributes do
+ record Expression
+ selector ::String
+ end)
+
def map_subexpressions(&block)
- self.class.new(Hash[*@record.map { |k, v| [k, block[v]] }], @field)
+ with(record: block[record], selector: selector)
end
end
class RecordProjection < Expression
- def initialize(record, *fields)
- unless fields.all? { |x| x.is_a?(String) }
- raise TypeError, "fields must be String"
- end
+ include(ValueSemantics.for_attributes do
+ record Expression
+ selectors Util::ArrayOf.new(::String, min: 1)
+ end)
- @record = record
- @fields = fields
+ def map_subexpressions(&block)
+ with(record: block[record], selectors: selectors)
end
+ end
+
+ class EmptyRecordProjection < Expression
+ include(ValueSemantics.for_attributes do
+ record Expression
+ end)
def map_subexpressions(&block)
- self.class.new(Hash[*@record.map { |k, v| [k, block[v]] }], @fields)
+ with(record: block[record])
end
end
class UnionType < Expression
+ attr_reader :record
+
def initialize(record)
@record = record
end
def map_subexpressions(&block)
- self.class.new(Hash[*@record.map { |k, v| [k, block[v]] }])
+ self.class.new(Hash[@record.map { |k, v| [k, block[v]] }])
end
- end
- class Union < Expression
- def initialize(tag, value, rest_of_type)
- raise TypeError, "tag must be a string" unless tag.is_a?(String)
+ def ==(other)
+ other.respond_to?(:record) && record.to_a == other.record.to_a
+ end
- @tag = tag
- @value = value
- @rest_of_type = rest_of_type
+ def eql?(other)
+ self == other
+ end
+
+ def fetch(k)
+ Function.new(
+ var: k,
+ type: record.fetch(k),
+ body: Union.new(
+ tag: k,
+ value: Variable.new(name: k),
+ alternatives: self.class.new(record.dup.tap { |r| r.delete(k) })
+ )
+ )
end
+ end
+
+ class Union < Expression
+ include(ValueSemantics.for_attributes do
+ tag ::String
+ value Expression
+ alternatives UnionType
+ end)
def map_subexpressions(&block)
- self.class.new(
- @tag,
- block[@value],
- Hash[*@rest_of_type.map { |k, v| [k, block[v]] }]
+ with(
+ tag: tag,
+ value: block[value],
+ alternatives: block[alternatives]
)
end
end
@@ 436,12 572,20 @@ module Dhall
include(ValueSemantics.for_attributes do
value ::Integer
end)
+
+ def to_s
+ "#{value >= 0 ? "+" : ""}#{value.to_s}"
+ end
end
class Double < Number
include(ValueSemantics.for_attributes do
value ::Float
end)
+
+ def to_s
+ value.to_s
+ end
end
class Text < Expression
@@ 516,43 660,46 @@ module Dhall
end
class Let
- def initialize(var, assign, type=nil)
- @var = var
- @assign = assign
- @type = type
- end
+ include(ValueSemantics.for_attributes do
+ var ::String
+ assign Expression
+ type Either(nil, Expression)
+ end)
def map_subexpressions(&block)
- self.class.new(@var, block[@assign], block[@type])
+ with(
+ var: var,
+ assign: block[assign],
+ type: type.nil? ? nil : block[type]
+ )
end
end
class LetBlock < Expression
- def initialize(body, *lets)
- unless lets.all? { |x| x.is_a?(Let) }
- raise TypeError, "LetBlock only contains Let"
- end
-
- @lets = lets
- @body = body
- end
+ include(ValueSemantics.for_attributes do
+ lets ArrayOf(Let)
+ body Expression
+ end)
def map_subexpressions(&block)
- self.class.new(
- block[@body],
- *@lets.map { |let| let.map_subexpressions(&block) }
+ with(
+ body: block[body],
+ lets: lets.map { |let| let.map_subexpressions(&block) }
)
end
end
class TypeAnnotation < Expression
- def initialize(value, type)
- @value = value
- @type = type
- end
+ include(ValueSemantics.for_attributes do
+ value Expression
+ type Expression
+ end)
def map_subexpressions(&block)
- self.class.new(block[@value], block[@type])
+ with(
+ value: block[value],
+ type: block[type]
+ )
end
end
end
M lib/dhall/binary.rb => lib/dhall/binary.rb +44 -28
@@ 43,15 43,19 @@ module Dhall
class Function
def self.decode(var_or_type, type_or_body, body_or_nil=nil)
if body_or_nil.nil?
- new("_", Dhall.decode(var_or_type), Dhall.decode(type_or_body))
+ new(
+ var: "_",
+ type: Dhall.decode(var_or_type),
+ body: Dhall.decode(type_or_body)
+ )
else
- unless var_or_type.is_a?(String)
- raise TypeError, "Function var must be a String"
- end
-
raise ArgumentError, "explicit var named _" if var_or_type == "_"
- new(var_or_type, Dhall.decode(type_or_body), Dhall.decode(body_or_nil))
+ new(
+ var: var_or_type,
+ type: Dhall.decode(type_or_body),
+ body: Dhall.decode(body_or_nil)
+ )
end
end
end
@@ 61,7 65,7 @@ module Dhall
Or, And, Equal, NotEqual,
Plus, Times,
TextConcatenate, ListConcatenate,
- RecordMerge, RecordOverride, RecordTypeMerge,
+ RecursiveRecordMerge, RightBiasedRecordMerge, RecursiveRecordTypeMerge,
ImportFallback
].freeze
@@ 99,34 103,46 @@ module Dhall
class Merge
def self.decode(record, input, type=nil)
new(
- Dhall.decode(record),
- Dhall.decode(input),
- type.nil? ? nil : Dhall.decode(type)
+ record: Dhall.decode(record),
+ input: Dhall.decode(input),
+ type: type.nil? ? nil : Dhall.decode(type)
)
end
end
class RecordType
def self.decode(record)
- new(Hash[record.map { |k, v| [k, Dhall.decode(v)] }])
+ if record.empty?
+ EmptyRecordType.new
+ else
+ new(Hash[record.map { |k, v| [k, Dhall.decode(v)] }])
+ end
end
end
class Record
def self.decode(record)
- new(Hash[record.map { |k, v| [k, Dhall.decode(v)] }])
+ if record.empty?
+ EmptyRecord.new
+ else
+ new(Hash[record.map { |k, v| [k, Dhall.decode(v)] }])
+ end
end
end
- class RecordFieldAccess
- def self.decode(record, field)
- new(Dhall.decode(record), field)
+ class RecordSelection
+ def self.decode(record, selector)
+ new(record: Dhall.decode(record), selector: selector)
end
end
class RecordProjection
- def self.decode(record, *fields)
- new(Dhall.decode(record), *fields)
+ def self.decode(record, *selectors)
+ if selectors.empty?
+ EmptyRecordProjection.new(record: Dhall.decode(record))
+ else
+ new(record: Dhall.decode(record), selectors: selectors)
+ end
end
end
@@ 137,11 153,11 @@ module Dhall
end
class Union
- def self.decode(tag, value, rest_of_type)
+ def self.decode(tag, value, alternatives)
new(
- tag,
- Dhall.decode(value),
- Hash[rest_of_type.map { |k, v| [k, Dhall.decode(v)] }]
+ tag: tag,
+ value: Dhall.decode(value),
+ alternatives: UnionType.decode(alternatives)
)
end
end
@@ 190,12 206,12 @@ module Dhall
class LetBlock
def self.decode(*parts)
new(
- Dhall.decode(parts.pop),
- *parts.each_slice(3).map do |(var, type, assign)|
+ body: Dhall.decode(parts.pop),
+ lets: parts.each_slice(3).map do |(var, type, assign)|
Let.new(
- var,
- Dhall.decode(assign),
- type.nil? ? nil : Dhall.decode(type)
+ var: var,
+ assign: Dhall.decode(assign),
+ type: type.nil? ? nil : Dhall.decode(type)
)
end
)
@@ 204,7 220,7 @@ module Dhall
class TypeAnnotation
def self.decode(value, type)
- new(Dhall.decode(value), Dhall.decode(type))
+ new(value: Dhall.decode(value), type: Dhall.decode(type))
end
end
@@ 235,7 251,7 @@ module Dhall
Merge,
RecordType,
Record,
- RecordFieldAccess,
+ RecordSelection,
RecordProjection,
UnionType,
Union,
M lib/dhall/builtins.rb => lib/dhall/builtins.rb +33 -3
@@ 19,6 19,36 @@ module Dhall
module Builtins
# rubocop:disable Style/ClassAndModuleCamelCase
+ class Double_show < Builtin
+ def call(arg)
+ if arg.is_a?(Double)
+ Text.new(value: "\"#{arg.to_s}\"")
+ else
+ super
+ end
+ end
+ end
+
+ class Integer_show < Builtin
+ def call(arg)
+ if arg.is_a?(Integer)
+ Text.new(value: "\"#{arg.to_s}\"")
+ else
+ super
+ end
+ end
+ end
+
+ class Integer_toDouble < Builtin
+ def call(arg)
+ if arg.is_a?(Integer)
+ Double.new(value: arg.value.to_f)
+ else
+ super
+ end
+ end
+ end
+
class Natural_build < Builtin
def fusion(arg, *bogus)
if bogus.empty? &&
@@ 35,9 65,9 @@ module Dhall
arg.call(
Variable.new(name: "Natural"),
Function.new(
- "_",
- Variable.new(name: "Natural"),
- Operator::Plus.new(
+ var: "_",
+ type: Variable.new(name: "Natural"),
+ body: Operator::Plus.new(
lhs: Variable.new(name: "_"),
rhs: Natural.new(value: 1)
)
M lib/dhall/normalize.rb => lib/dhall/normalize.rb +71 -1
@@ 126,6 126,24 @@ module Dhall
lhs.normalize.concat(rhs.normalize)
end
end
+
+ class RecursiveRecordMerge
+ def normalize
+ lhs.normalize.deep_merge(rhs.normalize)
+ end
+ end
+
+ class RightBiasedRecordMerge
+ def normalize
+ lhs.normalize.merge(rhs.normalize)
+ end
+ end
+
+ class RecursiveRecordTypeMerge
+ def normalize
+ lhs.normalize.deep_merge_type(rhs.normalize)
+ end
+ end
end
class List
@@ 141,21 159,58 @@ module Dhall
end
class Merge
+ def normalize
+ normalized = super
+ if normalized.record.is_a?(Record) && normalized.input.is_a?(Union)
+ normalized.record.fetch(normalized.input.tag).call(
+ normalized.input.value
+ )
+ else
+ normalized
+ end
+ end
end
class RecordType
+ def normalize
+ self.class.new(Hash[record.sort.map { |(k, v)| [k, v.normalize] }])
+ end
end
class Record
+ def normalize
+ self.class.new(Hash[record.sort.map { |(k, v)| [k, v.normalize] }])
+ end
+ end
+
+ class EmptyRecord
+ def normalize
+ self
+ end
end
- class RecordFieldAccess
+ class RecordSelection
+ def normalize
+ record.normalize.fetch(selector)
+ end
end
class RecordProjection
+ def normalize
+ record.normalize.slice(*selectors)
+ end
+ end
+
+ class EmptyRecordProjection
+ def normalize
+ EmptyRecord.new
+ end
end
class UnionType
+ def normalize
+ self.class.new(Hash[super.record.sort])
+ end
end
class Union
@@ 218,8 273,23 @@ module Dhall
end
class LetBlock
+ def normalize
+ lets.reduce(body) { |inside, let|
+ Application.new(
+ function: Function.new(
+ var: let.var,
+ type: let.type,
+ body: inside
+ ),
+ arguments: [let.assign]
+ )
+ }.normalize
+ end
end
class TypeAnnotation
+ def normalize
+ value.normalize
+ end
end
end
A test/normalization/beta/DoubleA.dhallb => test/normalization/beta/DoubleA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0fDouble<
\ No newline at end of file
A test/normalization/beta/DoubleB.dhallb => test/normalization/beta/DoubleB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0fDouble<
\ No newline at end of file
A test/normalization/beta/DoubleLiteralA.dhallb => test/normalization/beta/DoubleLiteralA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�?�333333<
\ No newline at end of file
A test/normalization/beta/DoubleLiteralB.dhallb => test/normalization/beta/DoubleLiteralB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�?�333333<
\ No newline at end of file
A test/normalization/beta/DoubleShowA.dhallb => test/normalization/beta/DoubleShowA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0kDouble/show<
\ No newline at end of file
A test/normalization/beta/DoubleShowB.dhallb => test/normalization/beta/DoubleShowB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0kDouble/show<
\ No newline at end of file
A test/normalization/beta/DoubleShowValueA.dhallb => test/normalization/beta/DoubleShowValueA.dhallb +0 -0
A test/normalization/beta/DoubleShowValueB.dhallb => test/normalization/beta/DoubleShowValueB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�e"1.2"<
\ No newline at end of file
A test/normalization/beta/IntegerA.dhallb => test/normalization/beta/IntegerA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0gInteger<
\ No newline at end of file
A test/normalization/beta/IntegerB.dhallb => test/normalization/beta/IntegerB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0gInteger<
\ No newline at end of file
A test/normalization/beta/IntegerNegativeA.dhallb => test/normalization/beta/IntegerNegativeA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� <
\ No newline at end of file
A test/normalization/beta/IntegerNegativeB.dhallb => test/normalization/beta/IntegerNegativeB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� <
\ No newline at end of file
A test/normalization/beta/IntegerPositiveA.dhallb => test/normalization/beta/IntegerPositiveA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�<
\ No newline at end of file
A test/normalization/beta/IntegerPositiveB.dhallb => test/normalization/beta/IntegerPositiveB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�<
\ No newline at end of file
A test/normalization/beta/IntegerShow-12A.dhallb => test/normalization/beta/IntegerShow-12A.dhallb +0 -0
A test/normalization/beta/IntegerShow-12B.dhallb => test/normalization/beta/IntegerShow-12B.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�e"-12"<
\ No newline at end of file
A test/normalization/beta/IntegerShow12A.dhallb => test/normalization/beta/IntegerShow12A.dhallb +0 -0
A test/normalization/beta/IntegerShow12B.dhallb => test/normalization/beta/IntegerShow12B.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�e"+12"<
\ No newline at end of file
A test/normalization/beta/IntegerShowA.dhallb => test/normalization/beta/IntegerShowA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0lInteger/show<
\ No newline at end of file
A test/normalization/beta/IntegerShowB.dhallb => test/normalization/beta/IntegerShowB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0lInteger/show<
\ No newline at end of file
A test/normalization/beta/IntegerToDouble-12A.dhallb => test/normalization/beta/IntegerToDouble-12A.dhallb +0 -0
A test/normalization/beta/IntegerToDouble-12B.dhallb => test/normalization/beta/IntegerToDouble-12B.dhallb +0 -0
A test/normalization/beta/IntegerToDouble12A.dhallb => test/normalization/beta/IntegerToDouble12A.dhallb +0 -0
A test/normalization/beta/IntegerToDouble12B.dhallb => test/normalization/beta/IntegerToDouble12B.dhallb +0 -0
A test/normalization/beta/IntegerToDoubleA.dhallb => test/normalization/beta/IntegerToDoubleA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0pInteger/toDouble<
\ No newline at end of file
A test/normalization/beta/IntegerToDoubleB.dhallb => test/normalization/beta/IntegerToDoubleB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0pInteger/toDouble<
\ No newline at end of file
A test/normalization/beta/LetA.dhallb => test/normalization/beta/LetA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�ax�ayax<
\ No newline at end of file
A test/normalization/beta/LetB.dhallb => test/normalization/beta/LetB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ay<
\ No newline at end of file
A test/normalization/beta/LetWithTypeA.dhallb => test/normalization/beta/LetWithTypeA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axaAayax<
\ No newline at end of file
A test/normalization/beta/LetWithTypeB.dhallb => test/normalization/beta/LetWithTypeB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ay<
\ No newline at end of file
A test/normalization/beta/MergeA.dhallb => test/normalization/beta/MergeA.dhallb +0 -0
A test/normalization/beta/MergeB.dhallb => test/normalization/beta/MergeB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ay<
\ No newline at end of file
A test/normalization/beta/MergeNormalizeArgumentsA.dhallb => test/normalization/beta/MergeNormalizeArgumentsA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0���axay��azab<
\ No newline at end of file
A test/normalization/beta/MergeNormalizeArgumentsB.dhallb => test/normalization/beta/MergeNormalizeArgumentsB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axaz<
\ No newline at end of file
A test/normalization/beta/MergeWithTypeA.dhallb => test/normalization/beta/MergeWithTypeA.dhallb +0 -0
A test/normalization/beta/MergeWithTypeB.dhallb => test/normalization/beta/MergeWithTypeB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ay<
\ No newline at end of file
A test/normalization/beta/MergeWithTypeNormalizeArgumentsA.dhallb => test/normalization/beta/MergeWithTypeNormalizeArgumentsA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0���axay��azab��aXaY<
\ No newline at end of file
A test/normalization/beta/MergeWithTypeNormalizeArgumentsB.dhallb => test/normalization/beta/MergeWithTypeNormalizeArgumentsB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axazaX<
\ No newline at end of file
A test/normalization/beta/RecordA.dhallb => test/normalization/beta/RecordA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��abaxaa��ayaz<
\ No newline at end of file
A test/normalization/beta/RecordB.dhallb => test/normalization/beta/RecordB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��aaayabax<
\ No newline at end of file
A test/normalization/beta/RecordEmptyA.dhallb => test/normalization/beta/RecordEmptyA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��<
\ No newline at end of file
A test/normalization/beta/RecordEmptyB.dhallb => test/normalization/beta/RecordEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��<
\ No newline at end of file
A test/normalization/beta/RecordProjectionA.dhallb => test/normalization/beta/RecordProjectionA.dhallb +2 -0
@@ 0,0 1,2 @@
+�e5.0.0�
+��axaaayabazacaxaz<
\ No newline at end of file
A test/normalization/beta/RecordProjectionB.dhallb => test/normalization/beta/RecordProjectionB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��axaaazac<
\ No newline at end of file
A test/normalization/beta/RecordProjectionEmptyA.dhallb => test/normalization/beta/RecordProjectionEmptyA.dhallb +2 -0
@@ 0,0 1,2 @@
+�e5.0.0�
+ax<
\ No newline at end of file
A test/normalization/beta/RecordProjectionEmptyB.dhallb => test/normalization/beta/RecordProjectionEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��<
\ No newline at end of file
A test/normalization/beta/RecordProjectionNormalizeArgumentsA.dhallb => test/normalization/beta/RecordProjectionNormalizeArgumentsA.dhallb +2 -0
@@ 0,0 1,2 @@
+�e5.0.0�
+��ayazaxay<
\ No newline at end of file
A test/normalization/beta/RecordProjectionNormalizeArgumentsB.dhallb => test/normalization/beta/RecordProjectionNormalizeArgumentsB.dhallb +2 -0
@@ 0,0 1,2 @@
+�e5.0.0�
+ayaxay<
\ No newline at end of file
A test/normalization/beta/RecordSelectionA.dhallb => test/normalization/beta/RecordSelectionA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ��axavax<
\ No newline at end of file
A test/normalization/beta/RecordSelectionB.dhallb => test/normalization/beta/RecordSelectionB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0av<
\ No newline at end of file
A test/normalization/beta/RecordSelectionNormalizeArgumentsA.dhallb => test/normalization/beta/RecordSelectionNormalizeArgumentsA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ��ayazax<
\ No newline at end of file
A test/normalization/beta/RecordSelectionNormalizeArgumentsB.dhallb => test/normalization/beta/RecordSelectionNormalizeArgumentsB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ayax<
\ No newline at end of file
A test/normalization/beta/RecordTypeA.dhallb => test/normalization/beta/RecordTypeA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��abaTaa��aAaB<
\ No newline at end of file
A test/normalization/beta/RecordTypeB.dhallb => test/normalization/beta/RecordTypeB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��aaaAabaT<
\ No newline at end of file
A test/normalization/beta/RecordTypeEmptyA.dhallb => test/normalization/beta/RecordTypeEmptyA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��<
\ No newline at end of file
A test/normalization/beta/RecordTypeEmptyB.dhallb => test/normalization/beta/RecordTypeEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeCollisionA.dhallb => test/normalization/beta/RecursiveRecordMergeCollisionA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0���ax��az���ax��ay�<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeCollisionB.dhallb => test/normalization/beta/RecursiveRecordMergeCollisionB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��ax��ay�az�<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeLhsEmptyA.dhallb => test/normalization/beta/RecursiveRecordMergeLhsEmptyA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0���ax<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeLhsEmptyB.dhallb => test/normalization/beta/RecursiveRecordMergeLhsEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ax<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeNoCollisionA.dhallb => test/normalization/beta/RecursiveRecordMergeNoCollisionA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0���ax��az���ab��ay�<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeNoCollisionB.dhallb => test/normalization/beta/RecursiveRecordMergeNoCollisionB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��ab��ay�ax��az�<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeNormalizeArgumentsA.dhallb => test/normalization/beta/RecursiveRecordMergeNormalizeArgumentsA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��ax�����ab<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeNormalizeArgumentsB.dhallb => test/normalization/beta/RecursiveRecordMergeNormalizeArgumentsB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axab<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeRhsEmptyA.dhallb => test/normalization/beta/RecursiveRecordMergeRhsEmptyA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�ax��<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordMergeRhsEmptyB.dhallb => test/normalization/beta/RecursiveRecordMergeRhsEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ax<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeCollisionA.dhallb => test/normalization/beta/RecursiveRecordTypeMergeCollisionA.dhallb +2 -0
@@ 0,0 1,2 @@
+�e5.0.0�
+��ax��azaA��ax��ayaB<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeCollisionB.dhallb => test/normalization/beta/RecursiveRecordTypeMergeCollisionB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��ax��ayaBazaA<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeLhsEmptyA.dhallb => test/normalization/beta/RecursiveRecordTypeMergeLhsEmptyA.dhallb +2 -0
@@ 0,0 1,2 @@
+�e5.0.0�
+��ax<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeLhsEmptyB.dhallb => test/normalization/beta/RecursiveRecordTypeMergeLhsEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ax<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeNoCollisionA.dhallb => test/normalization/beta/RecursiveRecordTypeMergeNoCollisionA.dhallb +2 -0
@@ 0,0 1,2 @@
+�e5.0.0�
+��ax��azaA��ab��ayaB<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeNoCollisionB.dhallb => test/normalization/beta/RecursiveRecordTypeMergeNoCollisionB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��ab��ayaBax��azaA<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeNormalizeArgumentsA.dhallb => test/normalization/beta/RecursiveRecordTypeMergeNormalizeArgumentsA.dhallb +4 -0
@@ 0,0 1,4 @@
+�e5.0.0�
+�
+ax���
+��ab<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeNormalizeArgumentsB.dhallb => test/normalization/beta/RecursiveRecordTypeMergeNormalizeArgumentsB.dhallb +2 -0
@@ 0,0 1,2 @@
+�e5.0.0�
+axab<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeRhsEmptyA.dhallb => test/normalization/beta/RecursiveRecordTypeMergeRhsEmptyA.dhallb +2 -0
@@ 0,0 1,2 @@
+�e5.0.0�
+ax��<
\ No newline at end of file
A test/normalization/beta/RecursiveRecordTypeMergeRhsEmptyB.dhallb => test/normalization/beta/RecursiveRecordTypeMergeRhsEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ax<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeCollisionA.dhallb => test/normalization/beta/RightBiasedRecordMergeCollisionA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ��ay�ax���ax�<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeCollisionB.dhallb => test/normalization/beta/RightBiasedRecordMergeCollisionB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��ax�ay�<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeLhsEmptyA.dhallb => test/normalization/beta/RightBiasedRecordMergeLhsEmptyA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ��ax<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeLhsEmptyB.dhallb => test/normalization/beta/RightBiasedRecordMergeLhsEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ax<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeNoCollisionA.dhallb => test/normalization/beta/RightBiasedRecordMergeNoCollisionA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ��ay�ax���aa�<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeNoCollisionB.dhallb => test/normalization/beta/RightBiasedRecordMergeNoCollisionB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��aa�ax�ay�<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeNormalizeArgumentsA.dhallb => test/normalization/beta/RightBiasedRecordMergeNormalizeArgumentsA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� � ax��� ay��<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeNormalizeArgumentsB.dhallb => test/normalization/beta/RightBiasedRecordMergeNormalizeArgumentsB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� axay<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeRhsEmptyA.dhallb => test/normalization/beta/RightBiasedRecordMergeRhsEmptyA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ax��<
\ No newline at end of file
A test/normalization/beta/RightBiasedRecordMergeRhsEmptyB.dhallb => test/normalization/beta/RightBiasedRecordMergeRhsEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ax<
\ No newline at end of file
A test/normalization/beta/TypeAnnotationA.dhallb => test/normalization/beta/TypeAnnotationA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axaA<
\ No newline at end of file
A test/normalization/beta/TypeAnnotationB.dhallb => test/normalization/beta/TypeAnnotationB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0ax<
\ No newline at end of file
A test/normalization/beta/UnionNormalizeAlternativesA.dhallb => test/normalization/beta/UnionNormalizeAlternativesA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axay�ay��aXaY<
\ No newline at end of file
A test/normalization/beta/UnionNormalizeAlternativesB.dhallb => test/normalization/beta/UnionNormalizeAlternativesB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axay�ayaX<
\ No newline at end of file
A test/normalization/beta/UnionNormalizeArgumentsA.dhallb => test/normalization/beta/UnionNormalizeArgumentsA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�ax��ayaz�<
\ No newline at end of file
A test/normalization/beta/UnionNormalizeArgumentsB.dhallb => test/normalization/beta/UnionNormalizeArgumentsB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axay�<
\ No newline at end of file
A test/normalization/beta/UnionProjectConstructorA.dhallb => test/normalization/beta/UnionProjectConstructorA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ��axaTax<
\ No newline at end of file
A test/normalization/beta/UnionProjectConstructorB.dhallb => test/normalization/beta/UnionProjectConstructorB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axaT�axax�<
\ No newline at end of file
A test/normalization/beta/UnionProjectConstructorNormalizeArgumentsA.dhallb => test/normalization/beta/UnionProjectConstructorNormalizeArgumentsA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ��ayazax<
\ No newline at end of file
A test/normalization/beta/UnionProjectConstructorNormalizeArgumentsB.dhallb => test/normalization/beta/UnionProjectConstructorNormalizeArgumentsB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0� ayax<
\ No newline at end of file
A test/normalization/beta/UnionSortAlternativesA.dhallb => test/normalization/beta/UnionSortAlternativesA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axay�azaAayaB<
\ No newline at end of file
A test/normalization/beta/UnionSortAlternativesB.dhallb => test/normalization/beta/UnionSortAlternativesB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0�axay�ayaBazaA<
\ No newline at end of file
A test/normalization/beta/UnionTypeA.dhallb => test/normalization/beta/UnionTypeA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��azaAaxaB<
\ No newline at end of file
A test/normalization/beta/UnionTypeB.dhallb => test/normalization/beta/UnionTypeB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��axaBazaA<
\ No newline at end of file
A test/normalization/beta/UnionTypeEmptyA.dhallb => test/normalization/beta/UnionTypeEmptyA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��<
\ No newline at end of file
A test/normalization/beta/UnionTypeEmptyB.dhallb => test/normalization/beta/UnionTypeEmptyB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��<
\ No newline at end of file
A test/normalization/beta/UnionTypeNormalizeArgumentsA.dhallb => test/normalization/beta/UnionTypeNormalizeArgumentsA.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��ax��aBaZazaA<
\ No newline at end of file
A test/normalization/beta/UnionTypeNormalizeArgumentsB.dhallb => test/normalization/beta/UnionTypeNormalizeArgumentsB.dhallb +1 -0
@@ 0,0 1,1 @@
+�e5.0.0��axaBazaA<
\ No newline at end of file