haskell 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b85cd42c60a8fd8905a866a3ef595379fc061422
4
- data.tar.gz: 95a13b1c977a43d4bcfaa1c3c34ba4f35b83994f
3
+ metadata.gz: e555bd13822ba64ac40eefd7874334266b76527b
4
+ data.tar.gz: 1203cdd7568b53f6931a59a0d5fecf0b754dbc3f
5
5
  SHA512:
6
- metadata.gz: 0bb0e886c7bce3e0ad68e20c1269df8e5874ec6104d16ff570598a40d03cabe098a60deec053f4ba6bb0e6081e20b64cf8ab7622fc1a4c41e34989fb0f3446ad
7
- data.tar.gz: 3626c9b3b1daa0e0a57b211308d3a21275729c4702c0978e14063015f3720a31ab825e1fe38fcb555fec47ce24d39ad988fc11f7d73186f4723c4a24cc79f22b
6
+ metadata.gz: aca2299d010c4264f693a13dce7ce27c213363824838ba80312fd21ee5fdee7fafff60779ddb6fb0349a8ca6a71c146b08b8fe5c898843588009e00bea0178e7
7
+ data.tar.gz: edcaa3d3fb1be593d1ce45b5baebe1329419232b114fada299b20c4dbe047039d0c25c956e0cb942fd203bbc2433d530e7661c1b269b6780bf6e0703c15845b7
data/.travis.yml CHANGED
@@ -1,3 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.1.2
4
+ - 2.0.0
5
+ - 1.9.3
6
+ notifications:
7
+ email: false
data/Gemfile CHANGED
@@ -1,6 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in haskell.gemspec
4
-
5
3
  gem 'pry'
6
4
  gemspec
data/README.md CHANGED
@@ -1,17 +1,20 @@
1
1
  # Ruby with Type.
2
2
 
3
- ```rb
3
+ Matz has mentioned Ruby3.0 with static type at some confluences. But almost all rubyists(include me) are not sure how typed Ruby is.
4
+
5
+ But it's worth thinking more. This gem is kind of trial without so much side-effect.
4
6
 
7
+ ```rb
5
8
  require 'haskell'
6
9
 
7
- # Ruby 2.1.0+
10
+ # ex1: (Ruby 2.1.0+)
8
11
  class MyClass
9
- type Numeric >= Numeric >= Numeric, def sum(x, y)
12
+ type Numeric >= Numeric >= Numeric, def sum(x, y)
10
13
  x + y
11
14
  end
12
15
 
13
16
  type Numeric >= Numeric >= Numeric, def wrong_sum(x, y)
14
- 'string'
17
+ 'string'
15
18
  end
16
19
  end
17
20
 
@@ -24,7 +27,22 @@ MyClass.new.sum(1, 'string')
24
27
  MyClass.new.wrong_sum(1, 2)
25
28
  #=> TypeError: Expected wrong_sum to return Numeric but got "str" instead
26
29
 
27
- # Ruby 1.8.0+
30
+
31
+ # ex2: (Ruby 2.1.0+)
32
+ class People
33
+ type People >= Any, def marry(people)
34
+ # Your Ruby code as usual
35
+ end
36
+ end
37
+
38
+ People.new.marry(People.new)
39
+ #=> no error
40
+
41
+ People.new.marry('non people')
42
+ #=> ArgumentError: Wrong type of argument, type of "non people" should be People
43
+
44
+
45
+ # ex3: (Ruby 1.8.0+)
28
46
  class MyClass
29
47
  def sum(x, y)
30
48
  x + y
@@ -33,6 +51,38 @@ class MyClass
33
51
  end
34
52
  ```
35
53
 
54
+ ## Feature
55
+ ### Typed method can coexist with non-typed method
56
+
57
+ ```ruby
58
+ # It's totally OK!!
59
+ class MyClass
60
+ type Numeric >= Numeric >= Numeric, def sum(x, y)
61
+ x + y
62
+ end
63
+
64
+ def wrong_sum(x, y)
65
+ 'string'
66
+ end
67
+ end
68
+ ```
69
+
70
+ ### Duck typing
71
+
72
+ ```ruby
73
+
74
+ class MyClass
75
+ type Any >= Numeric, def foo(any_obj)
76
+ 1
77
+ end
78
+ end
79
+
80
+ # It's totally OK!!
81
+ MyClass.new.foo(1)
82
+ # It's totally OK!!
83
+ MyClass.new.foo('str')
84
+ ```
85
+
36
86
  ## Installation
37
87
 
38
88
  Add this line to your application's Gemfile:
@@ -49,22 +99,6 @@ Or install it yourself as:
49
99
 
50
100
  $ gem install haskell
51
101
 
52
- ## More example
53
- ```ruby
54
- class People
55
- type People >= Any, def marry(people)
56
- # Your Ruby code as usual
57
- end
58
- end
59
-
60
- People.new.marry(People.new)
61
- #=> no error
62
-
63
- People.new.marry('non people')
64
- #=> ArgumentError: Wrong type of argument, type of "non people" should be People
65
-
66
- ```
67
-
68
102
  ## Contributing
69
103
 
70
104
  1. Fork it ( https://github.com/[my-github-username]/haskell/fork )
@@ -75,4 +109,4 @@ People.new.marry('non people')
75
109
 
76
110
 
77
111
  ## Credits
78
- [@chancancode](https://github.com/chancancode) first brought this to my attention.
112
+ [@chancancode](https://github.com/chancancode) first brought this to my attention. I've stolen some idea from him.
data/haskell.gemspec CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1.7"
23
- spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "bundler"
23
+ spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "rake-compiler"
25
25
  spec.add_development_dependency "minitest"
26
26
  end
data/lib/haskell.rb CHANGED
@@ -1,27 +1,15 @@
1
1
  require 'haskell/type_list'
2
+ require 'haskell/base'
3
+ require 'haskell/assert_arg_type'
4
+ require 'haskell/assert_rtn_type'
2
5
 
3
- module Haskell
4
- class << self
5
- def assert_arg_type(meth, args, klasses)
6
+ module Haskell; end
6
7
 
7
- args.each_with_index do |arg, i|
8
- if wrong_type?(arg, klasses[i])
9
- raise ArgumentError, "Wrong type of argument, type of #{arg.inspect} should be #{klasses[i]}"
10
- end
11
- end
12
- end
13
-
14
- def assert_rtn_type(meth, rtn, klass)
15
- if wrong_type?(rtn, klass)
16
- raise TypeError, "Expected #{meth} to return #{klass} but got #{rtn.inspect} instead"
17
- end
18
- end
19
-
20
- def wrong_type?(obj, klass)
21
- !(obj.is_a?(klass) || klass == Any)
22
- end
23
- end
24
- end
8
+ # New Class(Type)
9
+ class Any; end
10
+ module Boolean; end
11
+ TrueClass.send(:include, Boolean)
12
+ FalseClass.send(:include, Boolean)
25
13
 
26
14
  class Module
27
15
  private
@@ -32,13 +20,11 @@ class Module
32
20
 
33
21
  def type(type_list, meth)
34
22
  __haskell__.send(:define_method, meth) do |*args, &block|
35
- ::Haskell.assert_arg_type(meth, args, type_list.args)
23
+ ::Haskell::AssertArgType.execute(meth, args, type_list.args)
36
24
  rtn = super(*args, &block)
37
- ::Haskell.assert_rtn_type(meth, rtn, type_list.rtn)
25
+ ::Haskell::AssertRtnType.execute(meth, rtn, type_list.rtn)
38
26
  rtn
39
27
  end
40
28
  self
41
29
  end
42
30
  end
43
-
44
- class Any; end
@@ -0,0 +1,14 @@
1
+ module Haskell
2
+ module AssertArgType
3
+ extend Base
4
+
5
+ def self.execute(meth, args, klasses)
6
+ args.each_with_index do |arg, i|
7
+ if wrong_type?(arg, klasses[i])
8
+ raise ArgumentError, "Wrong type of argument, type of #{arg.inspect} should be #{klasses[i]}"
9
+ end
10
+ end
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module Haskell
2
+ module AssertRtnType
3
+ extend Base
4
+
5
+ def self.execute(meth, rtn, klass)
6
+ if wrong_type?(rtn, klass)
7
+ raise TypeError, "Expected #{meth} to return #{klass} but got #{rtn.inspect} instead"
8
+ end
9
+ end
10
+
11
+ def self.wrong_type?(obj, klass)
12
+ !(obj.is_a?(klass) || klass == Any)
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ module Haskell
2
+ module Base
3
+ def wrong_type?(obj, klass)
4
+ !(obj.is_a?(klass) || klass == Any)
5
+ end
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module Haskell
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/test/test_haskell.rb CHANGED
@@ -21,12 +21,14 @@ class TestHaskell < MiniTest::Unit::TestCase
21
21
  assert_correct_type Numeric >= String, [@numeric], @string
22
22
  assert_correct_type Numeric >= Hash, [@numeric], @hash
23
23
  assert_correct_type Numeric >= Symbol, [@numeric], @symbol
24
-
25
- assert_correct_type Numeric >= Numeric >= Numeric, [@numeric, @numeric], @numeric
26
- assert_correct_type Numeric >= Array >= Array, [@numeric, @array ], @array
27
- assert_correct_type Numeric >= String >= String, [@numeric, @string ], @string
28
- assert_correct_type Numeric >= Hash >= Hash, [@numeric, @hash ], @hash
29
- assert_correct_type Numeric >= Symbol >= Symbol, [@numeric, @symbol ], @symbol
24
+ assert_correct_type Numeric >= Boolean, [@numeric], true
25
+ assert_correct_type Numeric >= Boolean, [@numeric], false
26
+
27
+ assert_correct_type Boolean >= Numeric >= Numeric, [true, @numeric], @numeric
28
+ assert_correct_type Boolean >= Array >= Array, [true, @array ], @array
29
+ assert_correct_type Boolean >= String >= String, [true, @string ], @string
30
+ assert_correct_type Boolean >= Hash >= Hash, [true, @hash ], @hash
31
+ assert_correct_type Boolean >= Symbol >= Symbol, [true, @symbol ], @symbol
30
32
  end
31
33
 
32
34
  def test_wrong_return_type
@@ -84,9 +86,10 @@ class TestHaskell < MiniTest::Unit::TestCase
84
86
 
85
87
  def define_test_method(type_list, args, val)
86
88
  klass = Class.new.class_eval <<-RUBY_CODE
87
- type #{obj_literal(type_list)}, def call(#{arg_literal(args.count)})
89
+ def call(#{arg_literal(args.count)})
88
90
  #{obj_literal(val)}
89
91
  end
92
+ type #{obj_literal(type_list)}, :call
90
93
  RUBY_CODE
91
94
 
92
95
  klass.new
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haskell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - gogotanaka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-05 00:00:00.000000000 Z
11
+ date: 2014-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake-compiler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -81,13 +81,15 @@ files:
81
81
  - LICENSE.txt
82
82
  - README.md
83
83
  - Rakefile
84
- - a
85
84
  - bin/haskell
86
85
  - ext/haskell/extconf.rb
87
86
  - ext/haskell/haskell.c
88
87
  - ext/haskell/haskell.h
89
88
  - haskell.gemspec
90
89
  - lib/haskell.rb
90
+ - lib/haskell/assert_arg_type.rb
91
+ - lib/haskell/assert_rtn_type.rb
92
+ - lib/haskell/base.rb
91
93
  - lib/haskell/type_list.rb
92
94
  - lib/haskell/version.rb
93
95
  - test/minitest_helper.rb
data/a DELETED
@@ -1,11 +0,0 @@
1
- def test_any
2
- assert_wrong_arg @symbo >= @symbo, [@array ], @numeric
3
- assert_wrong_arg @symbo >= @symbo, [@string], @numeric
4
- assert_wrong_arg @symbo >= @symbo, [@hash ], @numeric
5
- assert_wrong_arg @symbo >= @symbo, [@symbol], @numeric
6
-
7
- assert_wrong_arg @symbo >= @symbo >= @symbo, [@numeric, @array ], @numeric
8
- assert_wrong_arg @symbo >= @symbo >= @symbo, [@numeric, @string], @numeric
9
- assert_wrong_arg @symbo >= @symbo >= @symbo, [@numeric, @hash ], @numeric
10
- assert_wrong_arg @symbo >= @symbo >= @symbo, [@numeric, @symbol], @numeric
11
- en