arrows 0.0.12 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/arrows.gemspec +1 -0
- data/lib/arrows.rb +11 -5
- data/lib/arrows/proc.rb +1 -1
- data/lib/arrows/version.rb +1 -1
- data/screenshot.png +0 -0
- data/spec/arrows/functor_spec.rb +51 -0
- data/spec/arrows/proc_spec.rb +17 -0
- data/spec/spec_helper.rb +12 -1
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1714106b8106878ddeefb250bd83433b5765fc32
|
4
|
+
data.tar.gz: 0204f75e8d10c5c155457a1eb3e83c7438e7a94d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebf7991ba43585e290da364f71cefdab7b822a412acd9f78f10f7d7edbbf76dfd5a0132e8730072229a331566884fba2e26e85e5b51832b6e618a6f3d48116c1
|
7
|
+
data.tar.gz: 827bee087974795d61ee21f0bc50e366423eed2ed5710e8b47e2ce52905782a3ed0b3c931bb1b63362557da9d9611d75d593711982079816932158b263ee48ca
|
data/arrows.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
+
spec.add_development_dependency "pry", ">= 0.10"
|
22
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
24
|
spec.add_development_dependency "rspec", ">=3.1"
|
24
25
|
end
|
data/lib/arrows.rb
CHANGED
@@ -42,11 +42,17 @@ module Arrows
|
|
42
42
|
return x if x.respond_to?(:good?) && x.respond_to?(:payload)
|
43
43
|
Arrows::Either.new false, x
|
44
44
|
end
|
45
|
-
def lift(x)
|
45
|
+
def lift(x=nil)
|
46
|
+
return Arrows::Proc.new { |args| yield args } if block_given?
|
46
47
|
return x if arrow_like? x
|
47
48
|
return wrap_proc x if proc_like? x
|
48
49
|
Arrows::Proc.new { |args| x }
|
49
50
|
end
|
51
|
+
def polarize(x=nil)
|
52
|
+
return lift { |args| yield(args) ? good(args) : evil(args) } if block_given?
|
53
|
+
return lift { |args| x.call(args) ? good(args) : evil(args) } if proc_like? x
|
54
|
+
lift { |args| x ? good(args) : evil(args) }
|
55
|
+
end
|
50
56
|
def arrow_like?(x)
|
51
57
|
proc_like?(x) &&
|
52
58
|
x.arity == 1 &&
|
@@ -65,8 +71,8 @@ module Arrows
|
|
65
71
|
end
|
66
72
|
end
|
67
73
|
end
|
68
|
-
ID = lift
|
69
|
-
Good = lift
|
70
|
-
Evil = lift
|
71
|
-
Die = lift
|
74
|
+
ID = lift { |x| x }
|
75
|
+
Good = lift { |x| good x }
|
76
|
+
Evil = lift { |x| evil x }
|
77
|
+
Die = lift { |x| throw x }
|
72
78
|
end
|
data/lib/arrows/proc.rb
CHANGED
data/lib/arrows/version.rb
CHANGED
data/screenshot.png
ADDED
Binary file
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Functor Laws' do
|
4
|
+
let(:id) do
|
5
|
+
-> (x) { x }
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:f) do
|
9
|
+
-> (x) { ->(y) { x } }.(SecureRandom.base64(1000)).extend(Composable)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:g) do
|
13
|
+
-> (x) { ->(y) { x } }.(SecureRandom.base64(1000)).extend(Composable)
|
14
|
+
end
|
15
|
+
|
16
|
+
# fmap id = id
|
17
|
+
describe 'identity' do
|
18
|
+
context 'when i have []' do
|
19
|
+
it 'should return []' do
|
20
|
+
result = Arrows.fmap(Arrows.lift([]), id)
|
21
|
+
expect(result.()).to eq([])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when i have [:x]' do
|
26
|
+
it 'should return [:x]' do
|
27
|
+
result = Arrows.fmap(Arrows.lift([:x]), id)
|
28
|
+
expect(result.()).to eq([:x])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# fmap (f . g) = fmap f . fmap g
|
34
|
+
describe 'composition' do
|
35
|
+
context 'when i have []' do
|
36
|
+
it do
|
37
|
+
lhs = Arrows.fmap(Arrows.lift([]), f * g)
|
38
|
+
rhs = Arrows.fmap(Arrows.fmap(Arrows.lift([]), g), f)
|
39
|
+
expect(lhs.()).to eq(rhs.())
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when i have [:x]' do
|
44
|
+
it do
|
45
|
+
lhs = Arrows.fmap(Arrows.lift([:x]), f * g)
|
46
|
+
rhs = Arrows.fmap(Arrows.fmap(Arrows.lift([:x]), g), f)
|
47
|
+
expect(lhs.()).to eq(rhs.())
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/spec/arrows/proc_spec.rb
CHANGED
@@ -13,6 +13,23 @@ RSpec.describe Arrows::Proc do
|
|
13
13
|
specify { should eq twenty_two.call }
|
14
14
|
end
|
15
15
|
|
16
|
+
context 'polarize' do
|
17
|
+
let(:numbers) { Arrows.lift [-2,-1,0,1,2,3] }
|
18
|
+
let(:heaviside) { Arrows.polarize { |x| x > 0 } }
|
19
|
+
let(:zero) { Arrows.lift { |x| 0 } }
|
20
|
+
let(:four) { Arrows.lift { |x| 4 } }
|
21
|
+
let(:zero_or_four) { heaviside >> (zero ^ four) }
|
22
|
+
let(:actual) { numbers >= zero_or_four }
|
23
|
+
context "basics" do
|
24
|
+
subject { heaviside.call 2 }
|
25
|
+
specify { should be_good }
|
26
|
+
end
|
27
|
+
context "full-force" do
|
28
|
+
subject { actual.call }
|
29
|
+
specify { should eq [4,4,4,0,0,0] }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
16
33
|
context 'rescue_from' do
|
17
34
|
let(:times2 ) { Arrows.lift -> (x) { x * 2 } }
|
18
35
|
let(:plus1) { Arrows.lift -> (x) { x == 4 ? raise(StandardError, "error: #{x}") : (x + 1) } }
|
data/spec/spec_helper.rb
CHANGED
@@ -1,2 +1,13 @@
|
|
1
1
|
# TODO: move the specs in also lol
|
2
|
-
require
|
2
|
+
require 'pry'
|
3
|
+
require File.expand_path("../../lib/arrows", __FILE__)
|
4
|
+
|
5
|
+
module Composable
|
6
|
+
def compose(f, g)
|
7
|
+
-> (x) { f.(g.(x)) }
|
8
|
+
end
|
9
|
+
|
10
|
+
def *(g)
|
11
|
+
compose(self, g)
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arrows
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Chen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.10'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,6 +98,8 @@ files:
|
|
84
98
|
- pics/fmap.mermaid.png
|
85
99
|
- pics/fork.mermaid
|
86
100
|
- pics/fork.mermaid.png
|
101
|
+
- screenshot.png
|
102
|
+
- spec/arrows/functor_spec.rb
|
87
103
|
- spec/arrows/proc_spec.rb
|
88
104
|
- spec/spec_helper.rb
|
89
105
|
homepage: http://github.com/foxnewsnetwork/arrows
|
@@ -106,10 +122,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
122
|
version: '0'
|
107
123
|
requirements: []
|
108
124
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
125
|
+
rubygems_version: 2.4.5
|
110
126
|
signing_key:
|
111
127
|
specification_version: 4
|
112
128
|
summary: Functional programming with composable, applicable, and arrowable functions.
|
113
129
|
test_files:
|
130
|
+
- spec/arrows/functor_spec.rb
|
114
131
|
- spec/arrows/proc_spec.rb
|
115
132
|
- spec/spec_helper.rb
|