Skip to content
/ go2funk Public

Simple Golang API to use functional types in Golang, such as immutable List, Options, Try, Either...

Notifications You must be signed in to change notification settings

glours/go2funk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Go2Funk

Go2Funk is a pet project to test Go2 Generics and see how this new feature help us to implement some functional structures easily.
The idea is to keep this repo as much as possible dependency free.

How to compile

Golang 1.18 has been release with type parameters.
You can now, compile and test your code as usual (go build, go test ...)

You can also use Docker Dev Environments to develop this project:

  • Open Docker Desktop
  • Go to Dev Environments view
  • Copy/Paste the git repo URL to start working!

Check the configuration of the base image in the .docker/config.json config file

Build

use go build ./... or if you use Goland then configure external tools

Run tests

use go test -v ./... or if you use Goland then configure external tools

Usage

Collection types

List

myIntArray := []int{1, 2, 3, 4, 5}
myList := OfSlice[int](myIntArray)

myList = myList.Append(6)
fmt.Println(myList.Length())

var mapper = func (value int) string { return strconv.Itoa(value) }

var evenPredicate = func (value int) bool { return value % 2 == 0 }

myList = MapList[int, string](myList.Filter(evenPredicate), mapper); 

For more usage details check tests.

Control types

Option

empytOption := Empty[int]()
someOption := Of[int](10)

fmt.Println(emptyOption.GetOrElse(5)) // Print 5
fmt.Println(someOption.GetOrElse(5)) // Print 10

var evenPredicate = func (value int) bool { return value % 2 == 0 }
fmt.Println(some.Filter(eventPredicate).IsEmpty()) #Print false

var mapper = func (value int) string { return strconv.Itoa(value) }
fmt.Println(MapOption(someOption, mapper)) // Print "10"

For more usage details check tests.

Try

defaultTryError := errors.New("default Try error")

failure := FailureOf[int](defaultTryError)
success := SuccessOf[int](10)

fmt.Println(failure.GetOrElse(5)) // Print 5
fmt.Println(someOption.GetOrElse(5)) // Print 10

fmt.Println(failure.GetOrElseCause()) // Print "default Try error"
fmt.Println(someOption.GetOrElseCause()) // Print 10

successLambda := func ()(int, error) { return 10, nil})
failureLambda := func ()(int, error) {return 0, defaultTryError }

fmt.Println(TryOf(failureLambda).IsFailure()) // Print true
fmt.Println(TryOf(successLambda).IsFailure()) // Print false

For more usage details check tests.

Either

defaultEitherError = errors.New("default Either error")
right = RightOf[error, int](10)
left = LeftOf[error, int](defaultEitherError)

fmt.Println(right.GetOrElse(20)) // Print 10
fmt.Println(left.GetOrElse(20)) // Print 20

fmt.Println(right.GetLeftOrElse(error.New("new error"))) // Print "new error"
fmt.Println(left.GetOrElse(error.New("new error"))) // Print "default Either error"

var mapper = func (value int) string { return strconv.Itoa(value) }
var mapRight Either[error, string] = MapEither(right, mapper)
fmt.Println(mapRight.GetOrElse("good")) // Print "10"

For more usage details check tests.

About

Simple Golang API to use functional types in Golang, such as immutable List, Options, Try, Either...

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages