monads
monads
Monads for Crystal.
Inspired by https://github.com/dry-rb/dry-monads
Installation
Add this to your application's shard.yml:
dependencies:
monads:
github: alex-lairan/monads
Usage
require "monads"
Many monads exist.
Maybe(T)
The Maybe monad helps to avoid nil and chain instructions.
There are two kinds of Maybe, Just and Nothing.
Just(T)
This is just a value.
Monads::Just.new(5)
Nothing(T)
This is an absence of value.
Monads::Nothing(Int32).new
Either(E, T)
The Either monad helps to manage errors at the end of the chain of instructions.
There are two kinds of Either, Right and Left.
Right(T)
This is just a value.
Monads::Right.new("Hello world")
Left(E)
This is an error.
Monads::Left.new("User password is incorrect")
List(T)
The List monad helps to manipulate an Array like a monad.
Monads::List[1, 6, 4, 2]
head
head returns the first element wrapped within a Maybe.
tail
tail returns the list without the first element.
Try(T)
The Try monad is a layer between Object Oriented Exception and Fuctional Programming Monads.
It can be transformed into a Maybe or an Either.
Task(T)
The Task monad is a parallelized Try monad.
Its goal is to use the power of fibers with monads.
How to use a monad ?
Monads have some methods which help to chain instructions.
Try and Task monads should be translated into a Maybe(T) or an Either(Exception, T) one.
fmap
The fmap procedure modify the internal value of a monad.
This doesn't affect Nothing and Left monads.
Example:
value = Monads::Just.new(5)
.fmap(->(x : Int32) { x.to_s })
.fmap(->(x : String) { x + "12" })
.fmap(->(x : String) { x.to_i })
.value!
value.should eq(512)
bind
The bind procedure allows to create a whole new monad from the internal data of another.
This doesn't affect Nothing and Left monads.
Example:
value = Monads::Just.new(5)
.bind(->(x : Int32) { Monads::Try(Int32).new(-> { x / 0}).to_maybe })
value.should eq(Monads::Nothing(Int32).new)
Development
Clone then let's go, no special requirements.
Contributing
- Fork it (https://github.com/alex-lairan/monads/fork)
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request
Contributors
- alex-lairan Alexandre Lairan - creator, maintainer
- moba1 moba - maintainer