blambeau/qrb

View on GitHub
lib/finitio/type/multi_relation_type.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Finitio
  #
  # The MultiRelation type generator allows capturing sets of information
  # facts, but allowing optional attributes. E. g.,
  #
  #     ColoredPoints = {{ point: Point, color :? Color }}
  #
  # This class allows capturing those types, in a way similar to
  # MultiTupleType:
  #
  #     ColoredPoints = MultiRelationType.new( Heading[...] )
  #
  # A ruby Set is used as concrete representation, and will contain hashes
  # that are valid representations of the associated multi tuple type:
  #
  #     R(ColoredPoints) = Set[ R({...}) ] = Set[Hash[...]]
  #
  # Accordingly, the dress transformation function has the signature below.
  # It expects an Enumerable as input and fails if any duplicate is found
  # (after tuple transformation), or if any tuple fails at being transformed.
  #
  #     dress :: Alpha  -> ColoredPoints   throws TypeError
  #     dress :: Object -> Set[Hash[...]]  throws TypeError
  #
  class MultiRelationType < Type
    include HeadingBasedType
    include RelBasedType

    def default_name
      "{{#{heading.to_name}}}"
    end

    def suppremum(other)
      super(other, RelationType, MultiRelationType)
    end

  end # class MultiRelationType
end # module Finitio