# frozen_string_literal: truerequire"bigdecimal"require"bigdecimal/util"require"date"moduleDrymoduleLogicmodulePredicatesmoduleMethodsdef[](name)method(name)enddeftype?(type,input)input.is_a?(type)enddefnil?(input)input.nil?endalias_method:none?,:nil?defkey?(name,input)input.key?(name)enddefattr?(name,input)input.respond_to?(name)enddefempty?(input)caseinputwhenString,Array,Hashtheninput.empty?whennilthentrueelsefalseendenddeffilled?(input)!empty?(input)enddefbool?(input)input.is_a?(TrueClass)||input.is_a?(FalseClass)enddefdate?(input)input.is_a?(Date)enddefdate_time?(input)input.is_a?(DateTime)enddeftime?(input)input.is_a?(Time)enddefnumber?(input)trueifFloat(input)rescueArgumentError,TypeErrorfalseenddefint?(input)input.is_a?(Integer)enddeffloat?(input)input.is_a?(Float)enddefdecimal?(input)input.is_a?(BigDecimal)enddefstr?(input)input.is_a?(String)enddefhash?(input)input.is_a?(Hash)enddefarray?(input)input.is_a?(Array)enddefodd?(input)input.odd?enddefeven?(input)input.even?enddeflt?(num,input)input<numenddefgt?(num,input)input>numenddeflteq?(num,input)!gt?(num,input)enddefgteq?(num,input)!lt?(num,input)enddefsize?(size,input)casesizewhenIntegerthensize.equal?(input.size)whenRange,Arraythensize.include?(input.size)elseraiseArgumentError,"+#{size}+ is not supported type for size? predicate."endenddefmin_size?(num,input)input.size>=numenddefmax_size?(num,input)input.size<=numenddefbytesize?(size,input)casesizewhenIntegerthensize.equal?(input.bytesize)whenRange,Arraythensize.include?(input.bytesize)elseraiseArgumentError,"+#{size}+ is not supported type for bytesize? predicate."endenddefmin_bytesize?(num,input)input.bytesize>=numenddefmax_bytesize?(num,input)input.bytesize<=numenddefinclusion?(list,input)::Kernel.warn"inclusion is deprecated - use included_in instead."included_in?(list,input)enddefexclusion?(list,input)::Kernel.warn"exclusion is deprecated - use excluded_from instead."excluded_from?(list,input)enddefincluded_in?(list,input)list.include?(input)enddefexcluded_from?(list,input)!list.include?(input)enddefincludes?(value,input)ifinput.respond_to?(:include?)input.include?(value)elsefalseendrescueTypeErrorfalseenddefexcludes?(value,input)!includes?(value,input)enddefeql?(left,right)left.eql?(right)enddefis?(left,right)left.equal?(right)enddefnot_eql?(left,right)!left.eql?(right)enddeftrue?(value)value.equal?(true)enddeffalse?(value)value.equal?(false)enddefformat?(regex,input)!input.nil?&®ex.match?(input)enddefcase?(pattern,input)pattern===inputenddefuuid_v1?(input)uuid_v1_format=/\A[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\z/iformat?(uuid_v1_format,input)enddefuuid_v2?(input)uuid_v2_format=/\A[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\z/iformat?(uuid_v2_format,input)enddefuuid_v3?(input)uuid_v3_format=/\A[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\z/iformat?(uuid_v3_format,input)enddefuuid_v4?(input)uuid_v4_format=/\A[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\z/iformat?(uuid_v4_format,input)enddefuuid_v5?(input)uuid_v5_format=/\A[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}\z/iformat?(uuid_v5_format,input)enddefuri?(schemes,input)uri_format=URI::DEFAULT_PARSER.make_regexp(schemes)format?(uri_format,input)enddefrespond_to?(method,input)input.respond_to?(method)enddefpredicate(name,&block)define_singleton_method(name,&block)endendextendMethodsdefself.included(other)superother.extend(Methods)endendendend