arrows 0.0.12 → 0.1.0

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: 87e62ace5a7ed0350a0f2933213138fbc4adf91d
4
- data.tar.gz: b3d590924508a3a8ee58b1b83c4f45d9df39244c
3
+ metadata.gz: 1714106b8106878ddeefb250bd83433b5765fc32
4
+ data.tar.gz: 0204f75e8d10c5c155457a1eb3e83c7438e7a94d
5
5
  SHA512:
6
- metadata.gz: e8a05896a7bc8593eaa83585fb71ab2957daf737597873639ffbe8653f2a4596dc9bf2220ec587200bc6066a52d342f52c13fae33b33a2397e4fef0d4735681b
7
- data.tar.gz: cbc2435c3618794b04fad75e7ebe38f2a1a5d2fbcdd4323768774e5c3cf359a3190a899cbf1eb34fe92999e01208f67108441227d1c8be0d52d014d38ef4722c
6
+ metadata.gz: ebf7991ba43585e290da364f71cefdab7b822a412acd9f78f10f7d7edbbf76dfd5a0132e8730072229a331566884fba2e26e85e5b51832b6e618a6f3d48116c1
7
+ data.tar.gz: 827bee087974795d61ee21f0bc50e366423eed2ed5710e8b47e2ce52905782a3ed0b3c931bb1b63362557da9d9611d75d593711982079816932158b263ee48ca
@@ -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
@@ -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 -> (x) { x }
69
- Good = lift -> (x) { good x }
70
- Evil = lift -> (x) { evil x }
71
- Die = lift -> (x) { throw x }
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
@@ -36,7 +36,7 @@ class Arrows::Proc < Proc
36
36
  end
37
37
 
38
38
  # rescues errors from procs
39
- def rescue_from(error_klass=StandardError, &block)
39
+ def rescue_from(error_klass=StandardError)
40
40
  Arrows.lift -> (args) {
41
41
  begin
42
42
  self[args]
@@ -1,3 +1,3 @@
1
1
  module Arrows
2
- VERSION = "0.0.12"
2
+ VERSION = "0.1.0"
3
3
  end
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
@@ -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) } }
@@ -1,2 +1,13 @@
1
1
  # TODO: move the specs in also lol
2
- require File.expand_path("../../lib/arrows", __FILE__)
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.12
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: 2014-12-25 00:00:00.000000000 Z
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.2.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