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 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