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