Popularity
7.0
Growing
Activity
6.0
Growing
774
6
19

Description

πŸ¦„ samber/mo brings monads and popular FP abstractions to Go projects.

The library uses the recent Go 1.18+ Generics.

Programming language: Go
License: MIT License
Tags: Functional     Go     Golang     Library     Monad    

mo alternatives and similar packages

Based on the "Functional" category.
Alternatively, view mo alternatives based on common mentions on social networks and blogs.

  • lo

    9.4 9.4 mo VS lo
    πŸ’₯ A Lodash-style Go library based on Go 1.18+ Generics (map, filter, contains, find...)
  • fpGo

    5.7 8.5 mo VS fpGo
    Monad, Functional Programming features for Golang
  • Scout APM allows you to find and fix performance issues with no hassle. Now with error monitoring and ο»Ώexternal services monitoring, Scout is a developer's best friend when it comes to application development.
    Promo
  • gofp

    4.5 3.1 mo VS gofp
    A super simple Lodash like utility library with essential functions that empowers the development in Go
  • fuego

    Functional Experiment in Golang
  • fp-go

    Fp-go is a collection of Functional Programming helpers powered by Golang 1.18+ generics.
  • Goterators

    A utility library that supports aggregate & transforms functions Go with generic. Such as filter, map, reduce, find, exist
  • underscore

    🌟 Useful functional programming helpers for Go 1.18 and beyond
  • valor

    Go option and result types that optionally contain a value

Do you think we are missing an alternative of mo or a related project?

Add another 'Functional' Package

README

mo - Monads

tag GoDoc Build Status Go report codecov

πŸ¦„ samber/mo brings monads and popular FP abstractions to Go projects. samber/mo uses the recent Go 1.18+ Generics.

Inspired by:

  • Scala
  • Rust
  • FP-TS

See also:

  • samber/lo: A Lodash-style Go library based on Go 1.18+ Generics
  • samber/do: A dependency injection toolkit based on Go 1.18+ Generics

Why this name?

I love short name for such utility library. This name is similar to "Monad Go" and no Go package currently uses this name.

πŸ’‘ Features

We currently support the following data types:

  • Option[T] (Maybe)
  • Result[T]
  • Either[A, B]
  • Future[T]
  • IO[T]
  • IOEither[T]
  • Task[T]
  • TaskEither[T]
  • State[S, A]

πŸš€ Install

go get github.com/samber/[email protected]

This library is v1 and follows SemVer strictly.

No breaking changes will be made to exported APIs before v2.0.0.

πŸ’‘ Quick start

You can import mo using:

import (
    "github.com/samber/mo"
)

Then use one of the helpers below:

option1 := mo.Some(42)
// Some(42)

option1.
    FlatMap(func (value int) Option[int] {
        return Some(value*2)
    }).
    FlatMap(func (value int) Option[int] {
        return Some(value%2)
    }).
    FlatMap(func (value int) Option[int] {
        return Some(value+21)
    }).
    OrElse(1234)
// 21

option2 := mo.None[int]()
// None

option2.OrElse(1234)
// 1234

option3 := option1.Match(
    func(i int) (int, bool) {
        // when value is present
        return i * 2, true
    },
    func() (int, bool) {
        // when value is absent
        return 0, false
    },
)
// Some(42)

More examples in documentation.

🀠 Documentation and examples

GoDoc: https://godoc.org/github.com/samber/mo

Option[T any]

Option is a container for an optional value of type T. If value exists, Option is of type Some. If the value is absent, Option is of type None.

Constructors:

  • mo.Some() doc
  • mo.None() doc
  • mo.TupleToOption() doc

Methods:

Result[T any]

Result respresent a result of an action having one of the following output: success or failure. An instance of Result is an instance of either Ok or Err. It could be compared to Either[error, T].

Constructors:

  • mo.Ok() doc
  • mo.Err() doc
  • mo.TupleToResult() doc

Methods:

Either[L any, R any]

Either respresents a value of 2 possible types. An instance of Either is an instance of either A or B.

Constructors:

  • mo.Left() doc
  • mo.Right() doc

Methods:

  • .IsLeft() doc
  • .IsRight() doc
  • .Left() doc
  • .Right() doc
  • .MustLeft() doc
  • .MustRight() doc
  • .LeftOrElse() doc
  • .RightOrElse() doc
  • .LeftOrEmpty() doc
  • .RightOrEmpty() doc
  • .Swap() doc
  • .ForEach() doc
  • .Match() doc
  • .MapLeft() doc
  • .MapRight() doc

Future[T any]

Future represents a value which may or may not currently be available, but will be available at some point, or an exception if that value could not be made available.

Constructors:

  • mo.NewFuture() doc

Methods:

IO[T any]

IO represents a non-deterministic synchronous computation that can cause side effects, yields a value of type R and never fails.

Constructors:

  • mo.NewIO() doc
  • mo.NewIO1() doc
  • mo.NewIO2() doc
  • mo.NewIO3() doc
  • mo.NewIO4() doc
  • mo.NewIO5() doc

Methods:

IOEither[T any]

IO represents a non-deterministic synchronous computation that can cause side effects, yields a value of type R and can fail.

Constructors:

  • mo.NewIOEither() doc
  • mo.NewIOEither1() doc
  • mo.NewIOEither2() doc
  • mo.NewIOEither3() doc
  • mo.NewIOEither4() doc
  • mo.NewIOEither5() doc

Methods:

Task[T any]

Task represents a non-deterministic asynchronous computation that can cause side effects, yields a value of type R and never fails.

Constructors:

  • mo.NewTask() doc
  • mo.NewTask1() doc
  • mo.NewTask2() doc
  • mo.NewTask3() doc
  • mo.NewTask4() doc
  • mo.NewTask5() doc
  • mo.NewTaskFromIO() doc
  • mo.NewTaskFromIO1() doc
  • mo.NewTaskFromIO2() doc
  • mo.NewTaskFromIO3() doc
  • mo.NewTaskFromIO4() doc
  • mo.NewTaskFromIO5() doc

Methods:

TaskEither[T any]

TaskEither represents a non-deterministic asynchronous computation that can cause side effects, yields a value of type R and can fail.

Constructors:

  • mo.NewTaskEither() doc
  • mo.NewTaskEitherFromIOEither() doc

Methods:

State[S any, A any]

State represents a function (S) -> (A, S), where S is state, A is result.

Constructors:

  • mo.NewState() doc
  • mo.ReturnState() doc

Methods:

πŸ›© Benchmark

// @TODO

This library does not use reflect package. We don't expect overhead.

🀝 Contributing

Don't hesitate ;)

With Docker

docker-compose run --rm dev

Without Docker

# Install some dev dependencies
make tools

# Run tests
make test
# or
make watch-test

πŸ‘€ Authors

  • Samuel Berthe

πŸ’« Show your support

Give a ⭐️ if this project helped you!

support us

πŸ“ License

Copyright Β© 2022 Samuel Berthe.

This project is [MIT](./LICENSE) licensed.


*Note that all licence references and agreements mentioned in the mo README section above are relevant to that project's source code only.