Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/frees-io/freestyle
A cohesive & pragmatic framework of FP centric Scala libraries
https://github.com/frees-io/freestyle
architectural-patterns cassandra free-monads freestyle functional-programming kafka monads redis rpc scala spark tagless-final
Last synced: 2 days ago
JSON representation
A cohesive & pragmatic framework of FP centric Scala libraries
- Host: GitHub
- URL: https://github.com/frees-io/freestyle
- Owner: frees-io
- License: apache-2.0
- Created: 2016-10-19T22:31:44.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2019-08-13T06:52:17.000Z (over 5 years ago)
- Last Synced: 2025-01-13T03:05:40.862Z (9 days ago)
- Topics: architectural-patterns, cassandra, free-monads, freestyle, functional-programming, kafka, monads, redis, rpc, scala, spark, tagless-final
- Language: Scala
- Homepage: http://frees.io/
- Size: 8.53 MB
- Stars: 614
- Watchers: 40
- Forks: 50
- Open Issues: 34
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
[comment]: # (Start Badges)
[![Build Status](https://travis-ci.org/frees-io/freestyle.svg?branch=master)](https://travis-ci.org/frees-io/freestyle) [![codecov.io](http://codecov.io/github/frees-io/freestyle/coverage.svg?branch=master)](http://codecov.io/github/frees-io/freestyle?branch=master) [![Maven Central](https://img.shields.io/badge/maven%20central-0.8.2-green.svg)](https://oss.sonatype.org/#nexus-search;gav~io.frees~frees*) [![Latest version](https://img.shields.io/badge/freestyle-0.8.2-green.svg)](https://index.scala-lang.org/frees-io/freestyle) [![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/frees-io/freestyle/master/LICENSE) [![Join the chat at https://gitter.im/47deg/freestyle](https://badges.gitter.im/47deg/freestyle.svg)](https://gitter.im/47deg/freestyle?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GitHub Issues](https://img.shields.io/github/issues/frees-io/freestyle.svg)](https://github.com/frees-io/freestyle/issues) [![Scala.js](http://scala-js.org/assets/badges/scalajs-0.6.22.svg)](http://scala-js.org)
[comment]: # (End Badges)
# Documentation
Full documentation available at [http://frees.io](http://frees.io)# Build purely functional applications and libraries
Build stack-safe purely functional applications and libraries that support parallel and sequential computations where declaration is decoupled from interpretation.
Freestyle encourages programs built atop [Free algebras](http://frees.io/docs/core/algebras/) that are interpreted at the edge of your application ensuring effects are localized and performed in a controlled environment.
Applications built with Freestyle can be interpreted to any runtime semantics supported by the interpreter target type.```scala
import freestyle.free._@free trait Database {
def get(id: UserId): FS[User]
}@free trait Cache {
def get(id: UserId): FS[User]
}@module trait Persistence {
val database: Database
val cache: Cache
}
```# Automatic Dependency Injection
Freestyle includes all the implicit machinery necessary to achieve seamless dependency injection of [`@free`](http://frees.io/docs/core/algebras/) and [`@module`](http://frees.io/docs/core//modules/) Algebras.
Simply require any of your `@free` or `@module` trait as implicits where needed.```scala
def storedUsers[F[_]]
(userId: UserId)
(implicit persistence: Persistence[F]): FreeS[F, (User, User)] = {
import persistence._
for {
cachedUser <- cache.get(userId)
persistentUser <- database.get(userId)
} yield (cachedUser, persistentUser)
}
```# Ready to use integrations
Freestyle ships with [ready to use algebras and convenient syntax extensions](http://frees.io/docs/integrations/) covering most of the application concerns such as persistence, configuration, logging, etc.
In addition Freestyle includes commonly used FP [effects](http://frees.io/docs/effects/) stack such as `option`, `error`, `reader`, `writer`, `state` based on the capabilities of
the target runtime interpreters.```scala
def loadUser[F[_]]
(userId: UserId)
(implicit
doobie: DoobieM[F],
logging: LoggingM[F]): FreeS[F, User] = {
import doobie.implicits._
for {
user <- (sql"SELECT * FROM User WHERE userId = $userId"
.query[User]
.unique
.liftFS[F])
_ <- logging.debug(s"Loaded User: ${user.userId}")
} yield user
}
```## Modules
+ [freestyle](http://frees.io/docs/) - Core module including building blocks for boilerplate free FP programs and apps over Free monads and cats.
+ [effects](http://frees.io/docs/effects/) - MTL style effects such as reader, writer, state, error, and more modeled as free algebras.
+ [logging](http://frees.io/docs/patterns/logging/) - A purely functional logging algebra over Verizon's Journal.
+ [cache](http://frees.io/docs/effects/Cache/) - A generic cache with in memory and redis based implementations.
## Integrations
+ [fetch](http://frees.io/docs/integrations/fetch/) - Integration with the Fetch library for efficient data access from heterogenous datasources.
+ [fs2](http://frees.io/docs/integrations/fs2/) - Integration to run fs2 Streams in Freestyle programs.
+ [monix](http://frees.io/docs/integrations/monix/) - Instances and utilities to interpret to `monix.eval.Task`.
+ [slick](http://frees.io/docs/integrations/slick/) - Embedding of DBIO actions in Freestyle programs.
+ [doobie](http://frees.io/docs/integrations/doobie/) - Embedding of Doobie ConnectionIO actions in Freestyle programs.
+ http - Adapters and marshallers to run the Freestyle program in endpoint return types for [akka-http](http://frees.io/docs/integrations/akkahttp/), [finch](http://frees.io/docs/integrations/finch/), [http4s](http://frees.io/docs/integrations/http4s/) and [play](http://frees.io/docs/integrations/play/).
## Freestyle Artifacts
Freestyle is compatible with both Scala JVM and Scala.js.
This project supports Scala 2.11 and 2.12. The project is based on [scalameta](http://scalameta.org/).
To use the project, add the following to your build.sbt:
```scala
addCompilerPlugin("org.scalameta" % "paradise" % "3.0.0-M11" cross CrossVersion.full)
```[comment]: # (Start Replace)
For Scala.jvm:
```scala
// required
libraryDependencies += "io.frees" %% "frees-core" % "0.8.2"// optional - effects and patterns
libraryDependencies += "io.frees" %% "frees-effects" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-async" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-async-cats-effect" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-async-guava" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-cache" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-config" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-logging" % "0.8.2"// optional - integrations
libraryDependencies += "io.frees" %% "frees-cache-redis" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-doobie" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-fetch" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-akka" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-finch" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-http-client" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-http4s" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-monix" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-play" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-slick" % "0.8.2"
libraryDependencies += "io.frees" %% "frees-twitter-util" % "0.8.2"
```For Scala.js:
```scala
// required
libraryDependencies += "io.frees" %%% "frees-core" % "0.8.2"// optional - effects and patterns
libraryDependencies += "io.frees" %%% "frees-effects" % "0.8.2"
libraryDependencies += "io.frees" %%% "frees-async" % "0.8.2"
libraryDependencies += "io.frees" %%% "frees-async-cats-effect" % "0.8.2"
libraryDependencies += "io.frees" %%% "frees-async-fs2" % "0.8.2"
libraryDependencies += "io.frees" %%% "frees-async-monix" % "0.8.2"
libraryDependencies += "io.frees" %%% "frees-cache" % "0.8.2"
libraryDependencies += "io.frees" %%% "frees-http-client" % "0.8.2"
libraryDependencies += "io.frees" %%% "frees-logging" % "0.8.2"// optional - integrations
libraryDependencies += "io.frees" %%% "frees-fetch" % "0.8.2"
libraryDependencies += "io.frees" %%% "frees-monix" % "0.8.2"
```[comment]: # (End Replace)
## Freestyle Examples
* [todolist-lib](./modules/examples/todolist-lib).
* [todolist-http-http4s](./modules/examples/todolist-http-http4s).
* [todolist-http-finch](./modules/examples/todolist-http-finch).
* [slick-example](.modules/examples/slick-example).## Commercial Support
47 Degrees offers commercial support for the Freestyle framework and associated technologies. To find out more, visit [47 Degrees' Open Source Support](https://www.47deg.com/services/open-source-support/).
[comment]: # (Start Copyright)
# CopyrightFreestyle is designed and developed by 47 Degrees
Copyright (C) 2017-2018 47 Degrees.
[comment]: # (End Copyright)