funkr 0.0.17 → 0.0.18
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/funkr/types.rb +1 -0
- data/lib/funkr/types/container.rb +32 -0
- data/lib/funkr/types/failable.rb +3 -3
- data/lib/funkr/types/maybe.rb +3 -3
- data/lib/funkr/types/simple_record.rb +14 -1
- data/lib/funkr/version.rb +1 -1
- data/test/tests.rb +8 -0
- metadata +4 -3
data/lib/funkr/types.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'funkr/categories'
|
2
|
+
|
3
|
+
module Funkr
|
4
|
+
module Types
|
5
|
+
class Container
|
6
|
+
|
7
|
+
include Funkr::Categories
|
8
|
+
|
9
|
+
def initialize(value)
|
10
|
+
@value = value
|
11
|
+
end
|
12
|
+
|
13
|
+
def unbox; @value; end
|
14
|
+
|
15
|
+
def to_s; format("{- %s -}", @value.to_s); end
|
16
|
+
|
17
|
+
include Functor
|
18
|
+
|
19
|
+
def map(&block)
|
20
|
+
self.class.new(yield(@value))
|
21
|
+
end
|
22
|
+
|
23
|
+
include Monoid
|
24
|
+
extend Monoid::ClassMethods
|
25
|
+
|
26
|
+
def mplus(c_y)
|
27
|
+
self.class.new(@value.mplus(c_y.unbox))
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/funkr/types/failable.rb
CHANGED
@@ -19,7 +19,7 @@ module Funkr
|
|
19
19
|
def map(&block)
|
20
20
|
case self.const
|
21
21
|
when :ok then
|
22
|
-
|
22
|
+
self.class.ok(yield(*self.data))
|
23
23
|
else self
|
24
24
|
end
|
25
25
|
end
|
@@ -30,7 +30,7 @@ module Funkr
|
|
30
30
|
self.match do |f_on|
|
31
31
|
f_on.ok do |f|
|
32
32
|
to.match do |t_on|
|
33
|
-
t_on.ok {|t|
|
33
|
+
t_on.ok {|t| self.class.ok(f.call(t)) }
|
34
34
|
t_on.failed { to }
|
35
35
|
end
|
36
36
|
end
|
@@ -58,7 +58,7 @@ module Funkr
|
|
58
58
|
x_on.ok do |x|
|
59
59
|
m_y.match do |y_on|
|
60
60
|
y_on.failed { self }
|
61
|
-
y_on.ok {|y|
|
61
|
+
y_on.ok {|y| self.class.ok(x.mplus(y))}
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
data/lib/funkr/types/maybe.rb
CHANGED
@@ -15,7 +15,7 @@ module Funkr
|
|
15
15
|
|
16
16
|
def map(&block)
|
17
17
|
self.match do |on|
|
18
|
-
on.just {|v|
|
18
|
+
on.just {|v| self.class.just(yield(v))}
|
19
19
|
on.nothing { self }
|
20
20
|
end
|
21
21
|
end
|
@@ -27,7 +27,7 @@ module Funkr
|
|
27
27
|
self.match do |f_on|
|
28
28
|
f_on.just do |f|
|
29
29
|
to.match do |t_on|
|
30
|
-
t_on.just {|t|
|
30
|
+
t_on.just {|t| self.class.unit(f.call(t)) }
|
31
31
|
t_on.nothing { to }
|
32
32
|
end
|
33
33
|
end
|
@@ -54,7 +54,7 @@ module Funkr
|
|
54
54
|
x_on.just do |x|
|
55
55
|
m_y.match do |y_on|
|
56
56
|
y_on.nothing { self }
|
57
|
-
y_on.just {|y|
|
57
|
+
y_on.just {|y| self.class.just(x.mplus(y))}
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
@@ -6,8 +6,21 @@ module Funkr
|
|
6
6
|
### r = SimpleRecord.new( name: "Paul", age: 27 )
|
7
7
|
### r.name => "Paul" ; r.age => 27
|
8
8
|
### name, age = r
|
9
|
-
|
9
|
+
|
10
|
+
### other usage :
|
11
|
+
### class Person < SimpleRecord; fields :name, :age; end
|
12
|
+
### Person.new( name: Paul ) => Error, missing :age
|
13
|
+
|
14
|
+
class << self; attr_accessor :fields_list; end
|
15
|
+
@fields_list = nil
|
16
|
+
|
17
|
+
def self.fields(*flds); self.fields_list = flds; end
|
18
|
+
|
10
19
|
def initialize(key_vals)
|
20
|
+
fields = self.class.fields_list
|
21
|
+
if not fields.nil? and fields != key_vals.keys then
|
22
|
+
raise "#{self.class.to_s} wrong initialization, expected #{fields}"
|
23
|
+
end
|
11
24
|
@key_vals = key_vals
|
12
25
|
key_vals.each do |k,v|
|
13
26
|
getter = k.to_sym
|
data/lib/funkr/version.rb
CHANGED
data/test/tests.rb
CHANGED
@@ -62,6 +62,10 @@ puts n.unbox.inspect
|
|
62
62
|
puts (Maybe.box(12)).unbox.inspect
|
63
63
|
puts (Maybe.box(nil)).unbox.inspect
|
64
64
|
|
65
|
+
puts "\n> Containers"
|
66
|
+
c = Container.new("Value")
|
67
|
+
puts c.unbox
|
68
|
+
puts c.map(&:reverse)
|
65
69
|
|
66
70
|
a = [1,2,3]
|
67
71
|
b = [10,20,30]
|
@@ -115,4 +119,8 @@ puts format("%s is back to %s and really lives in %s", r.name, r.age, r.city)
|
|
115
119
|
r.name = "Paul R"
|
116
120
|
puts r.to_s
|
117
121
|
|
122
|
+
class Person < SimpleRecord; fields :name, :age, :city; end
|
123
|
+
r = Person.new(name: "Paul", age: 27, city: "Rennes")
|
124
|
+
x = Person.new(name: "Paul", age: 27, city: "Rennes", genre: "Male") rescue "Forbidden"
|
125
|
+
y = Person.new(name: "Paul", age: 27) rescue "Forbidden"
|
118
126
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 18
|
9
|
+
version: 0.0.18
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Paul Rivier
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-09-
|
17
|
+
date: 2011-09-28 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- lib/funkr/extensions/enumerable.rb
|
48
48
|
- lib/funkr/extensions/fixnum.rb
|
49
49
|
- lib/funkr/types.rb
|
50
|
+
- lib/funkr/types/container.rb
|
50
51
|
- lib/funkr/types/failable.rb
|
51
52
|
- lib/funkr/types/maybe.rb
|
52
53
|
- lib/funkr/types/simple_record.rb
|