Sha256: 036d4c7eacce35ee23cd9bb5bfd7f2ba9c17114dabf035000eeecacb51e13d26

Contents?: true

Size: 1.1 KB

Versions: 1

Compression:

Stored size: 1.1 KB

Contents

# frozen_string_literal: true

module Grumlin
  module P
    module P
      class Predicate < TypedValue
        def initialize(name, args:, arg_type: nil)
          super(type: "P")
          @name = name
          @args = args
          @arg_type = arg_type
        end

        def value
          @value ||=
            {
              predicate: @name,
              value: TypedValue.new(type: @arg_type, value: @args).to_bytecode
            }
        end
      end

      # TODO: support more predicates
      %w[eq neq].each do |predicate|
        define_method predicate do |*args|
          Predicate.new(predicate, args: args[0])
        end
      end

      %w[within without].each do |predicate|
        define_method predicate do |*args|
          args = if args.count == 1 && args[0].is_a?(Array)
                   args[0]
                 elsif args.count == 1 && args[0].is_a?(Set)
                   args[0].to_a
                 else
                   args.to_a
                 end
          Predicate.new(predicate, args: args, arg_type: "List")
        end
      end
    end

    extend P
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
grumlin-0.11.0 lib/grumlin/p.rb