mayak 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module Mayak
5
+ module Predicates
6
+ class Rule
7
+ extend T::Sig
8
+ extend T::Helpers
9
+ extend T::Generic
10
+
11
+ A = type_member
12
+
13
+ sig { returns(T.proc.params(arg0: A).returns(T::Boolean)) }
14
+ attr_reader :fn
15
+
16
+ sig { params(blk: T.proc.params(arg0: A).returns(T::Boolean)).void }
17
+ def initialize(&blk)
18
+ @fn = T.let(blk, T.proc.params(arg0: A).returns(T::Boolean))
19
+ end
20
+
21
+ sig { params(object: A).returns(T::Boolean) }
22
+ def call(object)
23
+ fn.call(object)
24
+ end
25
+
26
+ sig { params(another: Mayak::Predicates::Rule[A]).returns(Mayak::Predicates::Rule[A]) }
27
+ def both(another)
28
+ Mayak::Predicates::Rule[A].new do |object|
29
+ fn.call(object) && another.call(object)
30
+ end
31
+ end
32
+ alias & both
33
+
34
+ sig { params(another: Mayak::Predicates::Rule[A]).returns(Mayak::Predicates::Rule[A]) }
35
+ def any(another)
36
+ Mayak::Predicates::Rule[A].new do |object|
37
+ fn.call(object) || another.call(object)
38
+ end
39
+ end
40
+ alias | any
41
+
42
+ sig { returns(Mayak::Predicates::Rule[A]) }
43
+ def negate
44
+ Mayak::Predicates::Rule[A].new do |object|
45
+ !fn.call(object)
46
+ end
47
+ end
48
+ alias ! negate
49
+
50
+ sig {
51
+ type_parameters(:B)
52
+ .params(function: Mayak::Function[T.type_parameter(:B), A])
53
+ .returns(Mayak::Predicates::Rule[T.type_parameter(:B)])
54
+ }
55
+ def from(function)
56
+ Mayak::Predicates::Rule.new do |object|
57
+ fn.call(function.call(object))
58
+ end
59
+ end
60
+
61
+ sig { returns(Mayak::Predicates::Rule[T.nilable(A)]) }
62
+ def presence
63
+ Mayak::Predicates::Rule[T.nilable(A)].new do |object|
64
+ case object
65
+ when nil
66
+ false
67
+ else
68
+ fn.call(object)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module Mayak
5
+ module Random
6
+ extend T::Sig
7
+
8
+ DEFAULT_JITTER = T.let(0.15, Float)
9
+
10
+ sig { params(number: T.any(Integer, Float), jitter: Float).returns(Float) }
11
+ def self.jittered(number, jitter: DEFAULT_JITTER)
12
+ (number + Kernel.rand(number * jitter)).to_f
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module Mayak
5
+ VERSION = T.let("0.0.1", String)
6
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module Mayak
5
+ class WeakRef
6
+ extend T::Sig
7
+ extend T::Generic
8
+
9
+ Value = type_member
10
+
11
+ class EmptyReferenceError < StandardError
12
+ end
13
+
14
+ @@__map = T.let(::ObjectSpace::WeakMap.new, ::ObjectSpace::WeakMap)
15
+
16
+ sig { params(value: Value).void }
17
+ def initialize(value)
18
+ @@__map[self] = value
19
+ end
20
+
21
+ sig { returns(Value) }
22
+ def deref!
23
+ if @@__map.key?(self)
24
+ @@__map[self]
25
+ else
26
+ raise EmptyReferenceError.new("Reference is empty")
27
+ end
28
+ end
29
+
30
+ sig { returns(Mayak::Monads::Maybe[Value]) }
31
+ def deref
32
+ Mayak::Monads::Maybe::Some[Value].new(deref!)
33
+ rescue
34
+ Mayak::Monads::Maybe::None[Value].new
35
+ end
36
+ end
37
+ end
data/lib/mayak.rb ADDED
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ require 'sorbet-runtime'
5
+
6
+ require_relative 'mayak/cache'
7
+ require_relative 'mayak/function'
8
+ require_relative 'mayak/json'
9
+ require_relative 'mayak/numeric'
10
+ require_relative 'mayak/random'
11
+ require_relative 'mayak/version'
12
+ require_relative 'mayak/weak_ref'
13
+
14
+ require_relative 'mayak/caching/unbounded_cache'
15
+ require_relative 'mayak/caching/lru_cache'
16
+
17
+ require_relative 'mayak/collections/priority_queue'
18
+ require_relative 'mayak/collections/queue'
19
+
20
+ require_relative 'mayak/http/decoder'
21
+ require_relative 'mayak/http/encoder'
22
+ require_relative 'mayak/http/request'
23
+ require_relative 'mayak/http/response'
24
+ require_relative 'mayak/http/verb'
25
+ require_relative 'mayak/http/client'
26
+ require_relative 'mayak/http/codec'
27
+
28
+ require_relative 'mayak/monads/maybe'
29
+ require_relative 'mayak/monads/result'
30
+ require_relative 'mayak/monads/try'
31
+
32
+ require_relative 'mayak/predicates/rule'
33
+
34
+ module Mayak
35
+ end
data/mayak.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ # lib = File.expand_path("lib", __dir__)
2
+ # $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ # require "mayak/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "mayak"
7
+ spec.version = "0.0.2"
8
+ spec.summary = "Set of fully typed utility classes and interfaces integrated with Sorbet."
9
+ spec.description = spec.summary
10
+ spec.authors = ["Daniil Bober"]
11
+ spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "mayak.gemspec", "lib/**/*"]
12
+ spec.license = "MIT"
13
+ spec.executables = []
14
+ spec.require_paths = ["lib"]
15
+
16
+ spec.add_dependency 'sorbet-runtime'
17
+ spec.add_dependency 'sorbet'
18
+
19
+ spec.add_development_dependency "bundler"
20
+ spec.add_development_dependency "rspec"
21
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mayak
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Daniil Bober
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-12-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sorbet-runtime
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sorbet
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Set of fully typed utility classes and interfaces integrated with Sorbet.
70
+ email:
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - README.md
76
+ - lib/mayak.rb
77
+ - lib/mayak/cache.rb
78
+ - lib/mayak/caching/README.md
79
+ - lib/mayak/caching/lru_cache.rb
80
+ - lib/mayak/caching/unbounded_cache.rb
81
+ - lib/mayak/collections/README.md
82
+ - lib/mayak/collections/priority_queue.rb
83
+ - lib/mayak/collections/queue.rb
84
+ - lib/mayak/function.rb
85
+ - lib/mayak/http/README.md
86
+ - lib/mayak/http/client.rb
87
+ - lib/mayak/http/codec.rb
88
+ - lib/mayak/http/decoder.rb
89
+ - lib/mayak/http/encoder.rb
90
+ - lib/mayak/http/request.rb
91
+ - lib/mayak/http/response.rb
92
+ - lib/mayak/http/verb.rb
93
+ - lib/mayak/json.rb
94
+ - lib/mayak/monads/README.md
95
+ - lib/mayak/monads/maybe.rb
96
+ - lib/mayak/monads/result.rb
97
+ - lib/mayak/monads/try.rb
98
+ - lib/mayak/numeric.rb
99
+ - lib/mayak/predicates/rule.rb
100
+ - lib/mayak/random.rb
101
+ - lib/mayak/version.rb
102
+ - lib/mayak/weak_ref.rb
103
+ - mayak.gemspec
104
+ homepage:
105
+ licenses:
106
+ - MIT
107
+ metadata: {}
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubygems_version: 3.4.10
124
+ signing_key:
125
+ specification_version: 4
126
+ summary: Set of fully typed utility classes and interfaces integrated with Sorbet.
127
+ test_files: []