Sha256: d93411434962389a35645f2b0cb94243971be184d0e06281009084d30d2597b2

Contents?: true

Size: 1.45 KB

Versions: 4

Compression:

Stored size: 1.45 KB

Contents

module Dry
  module Logic
    class Rule::Composite < Rule
      include Dry::Equalizer(:left, :right)

      attr_reader :left, :right

      def initialize(left, right)
        @left = left
        @right = right
      end

      def name
        :"#{left.name}_#{type}_#{right.name}"
      end

      def to_ast
        [type, [left.to_ast, right.to_ast]]
      end
      alias_method :to_a, :to_ast
    end

    class Rule::Implication < Rule::Composite
      def call(input)
        if left.(input).success?
          right.(input)
        else
          Logic.Result(true, left, input)
        end
      end

      def type
        :implication
      end
    end

    class Rule::Conjunction < Rule::Composite
      def call(input)
        result = left.(input)

        if result.success?
          right.(input)
        else
          result
        end
      end

      def type
        :and
      end
    end

    class Rule::Disjunction < Rule::Composite
      def call(input)
        result = left.(input)

        if result.success?
          result
        else
          right.(input)
        end
      end

      def type
        :or
      end
    end

    class Rule::ExclusiveDisjunction < Rule::Composite
      def call(input)
        Logic.Result(left.(input).success? ^ right.(input).success?, self, input)
      end

      def evaluate(input)
        [left.evaluate(input), right.evaluate(input)]
      end

      def type
        :xor
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dry-logic-0.2.3 lib/dry/logic/rule/composite.rb
dry-logic-0.2.2 lib/dry/logic/rule/composite.rb
dry-logic-0.2.1 lib/dry/logic/rule/composite.rb
dry-logic-0.2.0 lib/dry/logic/rule/composite.rb