From c8d755b00fa0aa066a4fc3d791e489a795cb0ccb Mon Sep 17 00:00:00 2001 From: johnnymo87 Date: Sat, 16 May 2015 00:28:25 +0000 Subject: [PATCH] extracts succession logic --- lib/prime_by_chain.rb | 2 +- lib/processors.rb | 52 ++++++++++++++++++++++++++----------------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/lib/prime_by_chain.rb b/lib/prime_by_chain.rb index bbb0fd2..55c8c8e 100644 --- a/lib/prime_by_chain.rb +++ b/lib/prime_by_chain.rb @@ -2,7 +2,7 @@ class PrimeByChain def is_prime?(input) - return false if Processors::LessThanTwo.new.not_prime?(input) + return false if Processors::MAIN.new.not_prime?(input) return true end diff --git a/lib/processors.rb b/lib/processors.rb index 63207c9..362d7d3 100644 --- a/lib/processors.rb +++ b/lib/processors.rb @@ -1,5 +1,12 @@ module Processors - class LessThanTwo + + class AbstractProcessor + def successor + EXECUTION_PLAN.fetch(self.class).call + end + end + + class LessThanTwo < AbstractProcessor def not_prime?(number) if number < 2 true @@ -7,13 +14,11 @@ def not_prime?(number) successor.not_prime?(number) end end - - def successor - Processors::IsEven.new - end end - class IsEven + MAIN = LessThanTwo + + class IsEven < AbstractProcessor def not_prime?(number) if number > 2 && number.even? true @@ -21,13 +26,9 @@ def not_prime?(number) successor.not_prime?(number) end end - - def successor - Processors::HasSquareRoot.new - end end - class HasSquareRoot + class HasSquareRoot < AbstractProcessor def not_prime?(number) sqrt = Math.sqrt(number) if sqrt == sqrt.floor @@ -36,13 +37,9 @@ def not_prime?(number) successor.not_prime?(number) end end - - def successor - Processors::HasIntegerDivisor.new - end end - class HasIntegerDivisor + class HasIntegerDivisor < AbstractProcessor def not_prime?(number) if divisor_found?(number) true @@ -51,10 +48,6 @@ def not_prime?(number) end end - def successor - Default.new - end - private def divisor_found?(number) @@ -70,4 +63,23 @@ def not_prime?(number) false end end + + EXECUTION_PLAN = { + LessThanTwo => -> do + IsEven.new + end, + + IsEven => -> do + Processors::HasSquareRoot.new + end, + + HasSquareRoot => -> do + Processors::HasIntegerDivisor.new + end, + + HasIntegerDivisor => -> do + Default.new + end, + } + end