lalka 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +107 -0
  3. data/lib/lalka/version.rb +1 -1
  4. data/lib/lalka.rb +23 -12
  5. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 41fe8edb888640fa3d3eb9d43d97ea5070854340
4
- data.tar.gz: f7be63f6f945e73393619c1d8362460c501f9203
3
+ metadata.gz: 8a73f1888ec88d74b7512761a7ef1a1b225896ea
4
+ data.tar.gz: d9414cfc7f078a2ca1b5fb55db185109b7939bc8
5
5
  SHA512:
6
- metadata.gz: 01926a458f59fdabd143ddf2d21e6d9c7a3ed5f05159fd5b4e4fccb68ad341e801f485152965951efc034f71b7459385e23233363251ab7eb3eec193c7488b14
7
- data.tar.gz: b036dd53768ca2df155bd152d1e21560b43819e8f85de9e820ec0c3250dc366d2ee82ccf676f9e778276bbf0bc710797af386fe408a5029ad92e5dd9fc2e854d
6
+ metadata.gz: b0ad66f8cb854dd0ba9d7796af9d6ca7b397aaa874fbf781913450e83b3e3626c61d474461604e4e4034fd81a051da61d6b49788d0644259751167cd042f4ceb
7
+ data.tar.gz: fad058b50f8e5231a817d733ed995ba04f409742b08b377a8761b6bf0ff5c8f936870f3378a0bc8a38c202a553d07c0edce36bc1dec9d622b726e752477b76c5
data/README.md CHANGED
@@ -4,6 +4,113 @@ Welcome to your new gem! In this directory, you'll find the files you need to be
4
4
 
5
5
  TODO: Delete this and the text above, and describe your gem
6
6
 
7
+ # Usage
8
+
9
+ ### Create:
10
+ ```ruby
11
+ task = Lalka::Task.new do |t| # block is not executed untill fork or fork_wait is called
12
+ t.resolve(value) # resolve task to a value
13
+ # or
14
+ t.reject(error) # reject task with an error
15
+ end
16
+ ```
17
+
18
+ ### Create with predefined state:
19
+ ```ruby
20
+ resolved_task = Lalka::Task.resolve(value) # task which resolves to a value
21
+ rejected_task = Lalka::Task.reject(error) # task which rejects to a value
22
+ ```
23
+
24
+ ### fork:
25
+ ```ruby
26
+ # fork is nonblocking, returns nil
27
+ task.fork do |t|
28
+ t.on_success do |value|
29
+ # do something with a value
30
+ end
31
+
32
+ t.on_error do |error|
33
+ # handle error
34
+ end
35
+ end
36
+ ```
37
+
38
+ ### fork_wait:
39
+ ```ruby
40
+ # fork_wait blocks and returns Either from "dry-monads" gem
41
+ task = Lalka::Task.resolve(99)
42
+
43
+ result = task.fork_wait do |t|
44
+ t.on_success do |value|
45
+ value + 1
46
+ end
47
+
48
+ t.on_error do |error|
49
+ # ...
50
+ end
51
+ end
52
+
53
+ result # Right(100)
54
+ ```
55
+
56
+ ```ruby
57
+ task = Lalka::Task.reject('error')
58
+
59
+ result = task.fork_wait do |t|
60
+ t.on_success do |value|
61
+ # ...
62
+ end
63
+
64
+ t.on_error do |error|
65
+ "Error: " + error
66
+ end
67
+ end
68
+
69
+ result # Left("Error: error")
70
+ ```
71
+
72
+ ### map:
73
+ ```ruby
74
+ task = Lalka::Task.resolve(99).map { |v| v + 1 }.map { |v| v.to_s + "!" }
75
+
76
+ result = task.fork_wait
77
+ result # Right("100!")
78
+ ```
79
+
80
+ ```ruby
81
+ task = Lalka::Task.reject('error').map { |v| v + 1 }.map { |v| v.to_s + "!" }
82
+
83
+ result = task.fork_wait
84
+ result # Left("error")
85
+ ```
86
+
87
+ ### bind:
88
+ ```ruby
89
+ task = Lalka::Task.resolve(99).bind { |v| Lalka::Task.resolve(v + 1) }
90
+
91
+ result = task.fork_wait
92
+ result # Right(100)
93
+ ```
94
+
95
+ ### ap:
96
+ ```ruby
97
+ task = Lalka::Task.resolve(-> (v) { v + 1 }).ap(Lalka::Task.resolve(99))
98
+
99
+ result = task.fork_wait
100
+ result # Right(100)
101
+ ```
102
+
103
+ ```ruby
104
+ task1 = Lalka::Task.resolve(99)
105
+ task2 = Lalka::Task.resolve(1)
106
+
107
+ result = task1.map { |x| -> (y) { x + y } }.ap(task2).fork_wait
108
+ result # Right(100)
109
+
110
+ result = Lalka::Task.resolve(-> (x) { -> (y) { x + y } }).ap(task1).ap(task2).fork_wait
111
+ result # Right(100)
112
+ ```
113
+
7
114
  ## Installation
8
115
 
9
116
  Add this line to your application's Gemfile:
data/lib/lalka/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Lalka
3
- VERSION = '0.1.0'
3
+ VERSION = '0.2.0'
4
4
  end
data/lib/lalka.rb CHANGED
@@ -18,6 +18,11 @@ module Lalka
18
18
  t.reject(error)
19
19
  end
20
20
  end
21
+
22
+ def id(internal)
23
+ internal.on_success { |v| v }
24
+ internal.on_error { |e| e }
25
+ end
21
26
  end
22
27
 
23
28
  def initialize(&block)
@@ -27,7 +32,13 @@ module Lalka
27
32
  def fork_wait
28
33
  queue = Queue.new
29
34
  internal = Internal.new(queue)
30
- yield internal
35
+
36
+ if block_given?
37
+ yield internal
38
+ else
39
+ Task.id(internal)
40
+ end
41
+
31
42
  @computation.call(internal)
32
43
  queue.pop
33
44
  end
@@ -42,7 +53,7 @@ module Lalka
42
53
  def map
43
54
  Task.new do |t|
44
55
  fork do |this|
45
- this.on_sucess do |value|
56
+ this.on_success do |value|
46
57
  t.resolve(yield value)
47
58
  end
48
59
 
@@ -56,11 +67,11 @@ module Lalka
56
67
  def bind
57
68
  Task.new do |t|
58
69
  fork do |this|
59
- this.on_sucess do |first_value|
70
+ this.on_success do |first_value|
60
71
  other_task = yield first_value
61
72
 
62
73
  other_task.fork do |other|
63
- other.on_sucess do |second_value|
74
+ other.on_success do |second_value|
64
75
  t.resolve(second_value)
65
76
  end
66
77
 
@@ -82,7 +93,7 @@ module Lalka
82
93
  q = Queue.new
83
94
 
84
95
  fork do |this|
85
- this.on_sucess do |fn|
96
+ this.on_success do |fn|
86
97
  q.push [:fn, fn]
87
98
  end
88
99
 
@@ -92,7 +103,7 @@ module Lalka
92
103
  end
93
104
 
94
105
  other_task.fork do |other|
95
- other.on_sucess do |value|
106
+ other.on_success do |value|
96
107
  q.push [:arg, value]
97
108
  end
98
109
 
@@ -130,15 +141,15 @@ module Lalka
130
141
 
131
142
  class InternalAsync
132
143
  def resolve(value)
133
- @on_sucess.call(value)
144
+ @on_success.call(value)
134
145
  end
135
146
 
136
147
  def reject(error)
137
148
  @on_error.call(error)
138
149
  end
139
150
 
140
- def on_sucess(&block)
141
- @on_sucess = block
151
+ def on_success(&block)
152
+ @on_success = block
142
153
  nil
143
154
  end
144
155
 
@@ -154,7 +165,7 @@ module Lalka
154
165
  end
155
166
 
156
167
  def resolve(value)
157
- result = @on_sucess.call(value)
168
+ result = @on_success.call(value)
158
169
  @queue.push Dry::Monads.Right(result)
159
170
  end
160
171
 
@@ -163,8 +174,8 @@ module Lalka
163
174
  @queue.push Dry::Monads.Left(result)
164
175
  end
165
176
 
166
- def on_sucess(&block)
167
- @on_sucess = block
177
+ def on_success(&block)
178
+ @on_success = block
168
179
  end
169
180
 
170
181
  def on_error(&block)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lalka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vlad Shmyhlo