lalka 0.1.0 → 0.2.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.
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