lib/haskell.rb in haskell-0.0.2 vs lib/haskell.rb in haskell-0.0.3

- old
+ new

@@ -1,44 +1,30 @@ require 'haskell/type_list' +require 'haskell/base' +require 'haskell/assert_arg_type' +require 'haskell/assert_rtn_type' -module Haskell - class << self - def assert_arg_type(meth, args, klasses) +module Haskell; end - args.each_with_index do |arg, i| - if wrong_type?(arg, klasses[i]) - raise ArgumentError, "Wrong type of argument, type of #{arg.inspect} should be #{klasses[i]}" - end - end - end +# New Class(Type) +class Any; end +module Boolean; end +TrueClass.send(:include, Boolean) +FalseClass.send(:include, Boolean) - def assert_rtn_type(meth, rtn, klass) - if wrong_type?(rtn, klass) - raise TypeError, "Expected #{meth} to return #{klass} but got #{rtn.inspect} instead" - end - end - - def wrong_type?(obj, klass) - !(obj.is_a?(klass) || klass == Any) - end - end -end - class Module private def __haskell__ prepend (@__haskell__ = Module.new) unless @__haskell__ @__haskell__ end def type(type_list, meth) __haskell__.send(:define_method, meth) do |*args, &block| - ::Haskell.assert_arg_type(meth, args, type_list.args) + ::Haskell::AssertArgType.execute(meth, args, type_list.args) rtn = super(*args, &block) - ::Haskell.assert_rtn_type(meth, rtn, type_list.rtn) + ::Haskell::AssertRtnType.execute(meth, rtn, type_list.rtn) rtn end self end end - -class Any; end