All Projects → GlenKPeterson → Paguro

GlenKPeterson / Paguro

Licence: apache-2.0
Generic, Null-safe, Immutable Collections and Functional Transformations for the JVM

Programming Languages

java
68154 projects - #9 most used programming language
kotlin
9241 projects
clojure
4091 projects

Projects that are alternatives of or similar to Paguro

QuickImageFX
Simplifying image manipulation using GDI, Graphics32, OpenCV or Vampyre Imaging libraries
Stars: ✭ 41 (-82.25%)
Mutual labels:  stream, transformations
dot
distributed data sync with operational transformation/transforms
Stars: ✭ 73 (-68.4%)
Mutual labels:  stream, transformations
Easyreact
Are you confused by the functors, applicatives, and monads in RxSwift and ReactiveCocoa? It doesn't matter, the concepts are so complicated that not many developers actually use them in normal projects. Is there an easy-to-use way to use reactive programming? EasyReact is born for this reason.
Stars: ✭ 1,616 (+599.57%)
Mutual labels:  stream, transformations
rxjava2-http
Transmit RxJava2 Flowable over http with non-blocking backpressure
Stars: ✭ 19 (-91.77%)
Mutual labels:  stream, jvm
Scramjet
Simple yet powerful live data computation framework
Stars: ✭ 171 (-25.97%)
Mutual labels:  stream, transformations
Ixjava
Iterable Extensions for Java 6+
Stars: ✭ 210 (-9.09%)
Mutual labels:  stream
Transport Eta
Twitch streamed 🎥playground repo, README speaks to you.
Stars: ✭ 223 (-3.46%)
Mutual labels:  stream
Trimesh2
C++ library and set of utilities for input, output, and basic manipulation of 3D triangle meshes
Stars: ✭ 206 (-10.82%)
Mutual labels:  transformations
Tt
a Pythonic toolkit for working with Boolean expressions
Stars: ✭ 206 (-10.82%)
Mutual labels:  transformations
Zipson
JSON parse and stringify with compression
Stars: ✭ 229 (-0.87%)
Mutual labels:  stream
Firebase Esp8266
ESP8266 Firebase RTDB Arduino Library
Stars: ✭ 228 (-1.3%)
Mutual labels:  stream
Eta
The Eta Programming Language, a dialect of Haskell on the JVM
Stars: ✭ 2,507 (+985.28%)
Mutual labels:  jvm
Core
The core functionality of OsmSharp.
Stars: ✭ 210 (-9.09%)
Mutual labels:  stream
Future
High-performance Future implementation for the JVM
Stars: ✭ 223 (-3.46%)
Mutual labels:  jvm
Byte Stream
A non-blocking stream abstraction for PHP based on Amp.
Stars: ✭ 208 (-9.96%)
Mutual labels:  stream
Twitch Js
A community-centric, community-supported version of tmi.js
Stars: ✭ 225 (-2.6%)
Mutual labels:  stream
Streamsaver.js
StreamSaver writes stream to the filesystem directly asynchronous
Stars: ✭ 2,784 (+1105.19%)
Mutual labels:  stream
Javainterview
java中高级基础指南
Stars: ✭ 222 (-3.9%)
Mutual labels:  jvm
Java8 Tutorial
Modern Java - A Guide to Java 8
Stars: ✭ 15,276 (+6512.99%)
Mutual labels:  stream
Styx
Programmable, asynchronous, event-based reverse proxy for JVM.
Stars: ✭ 218 (-5.63%)
Mutual labels:  jvm

Hermit Crab

Maven Central javadoc Build Status codecov Google group : Email List

Why Use Paguro?

Paguro is designed to:

  1. Make Functional Programming simpler and easier in Java.
  2. Decrease the number of things you need to think about when coding.

Removing distractions leaves you more energy for creativity and problem-solving. Paguro lets you forget about:

  • Potential modifications to shared collections (immutable collections are safe to share)
  • The cost of adding items to an unmodifiable collection (immutable collections support extremely lightweight modified copies)
  • Which collections are modifiable (your compiler knows)
  • Arrays vs. collections (use xformArray(myArray) to encapsulate arrays)
  • Primitives vs. boxed objects (Don't use primitives - generics can't handle them anyway)
  • Checked exceptions in lambdas (Paguro accepts them without complaint)
  • Null pointer exceptions

Kotlin fixes almost all these issues too, but if you're stuck in Java, Paguro is a great solution.

What's in Paguro?

Type-safe, null-safe versions of Clojure's immutable/persistent collections, an immutable alternative to Java 8 Streams that handles checked exceptions in lambdas, and other tools to make functional programming in Java easier.

Why is it called Paguro?

Paguro is short for the Latin "Paguroidea" - the name of the Hermit Crab superfamily in Biology. These collections grow by adding a new shell, leaving the insides the same, much the way Hermit Crabs trade up to a new shell when they grow.

Specific Features

  • Immutable collections api / src - type-safe generic Java versions of Clojure's immutable (HAMT = 'Hash Array Mapped Trie') collections - arguably the best immutable collections on the JVM. Plus an RRB Tree!
  • Functional transformations api / src are like a type-safe version of Clojure's Transducers, or a simplified immutable alternative to Java 8 Streams, wrapping checked exceptions and avoiding primitives (you can still use Java 8 streams if you want to).
  • Brief collection constructors api / src are like a tiny, type-safe data definition language (a little like JSON for Java):
    • vec("one", "two", "three") - an immutable vector/list of three strings
    • set(3, 5, 7) - an immutable set of three integers
    • tup("Alice", 11, 3.14) - an immutable 3-field tuple or record
    • map(tup(1, "single"), tup(2, "double"), tup(3, "triple")) - an immutable map that uses integers to look up appropriate strings.
  • Extensible, immutable tuples api / src - use them for rapid, yet type-safe prototyping, then later extend them to make your own lightweight, immutable Java classes with correct equals(), hashCode(), and toString() implementations.
  • Lazy initialization api / src - LazyRef thread-safely performs initialization and frees initialization resources on first use. Subsequent uses get the now-constant initialized value. Use this instead of static initializers to avoid initialization loops. Cache results of expensive operations for reuse.
  • Union types api / src - Not as nice as being built into the language, but they extend type safety outside the object hierarchy.
  • Memoization api / src - Turns function calls into hashtable lookups to speed up slow functions over a limited range of inputs.
  • Tiny with no dependencies - The entire project fits in a 270K jar file.

Examples

Usage examples are implemented as unit tests to ensure that they remain correct and current.

Getting Started

Classic

You are on the Paguro Classic, or main branch of this project. If you work with pure Java, or a mix of Java and Kotlin files, this is your branch. If you want to live dangerously, try the all-Kotlin version in the 4.0 branch when it becomes available.

News

Don't use RrbTree.join()!

@jafingerhut has found bugs in the RRB Tree join implementation. See issue 31 and 36. I normally try to fix bugs promptly, this issue requires more thought! If anyone knows of a paper with a working algorithm for merging two n-ary BTrees, let us know!

Check the Change Log for details of recent changes.

FAQ

Q: Why are you doing this?

It started with a Software Engineering Stack Exchange question: Why doesn't Java provide immutable collections?

Q: How does this compare to PCollections?

Paguro is based on Clojure, is faster, and has additional features

Q: Do these Transforms create intermediate collections between each operation (like the Scala collections)?

No

Q: How does this compare to Streams and lambda expressions in JDK8?

Comparison

Q: Why Java instead of another/better JVM language?

Why Java? That said, this could become a Kotlin-based project.

Licenses

Java™ is a registered trademark of the Oracle Corporation in the US and other countries. Paguro is not part of Java. Oracle is in no way affiliated with the Paguro project.

Paguro is not part of Clojure. Rich Hickey and the Clojure team are in no way affiliated with the Paguro project, though it borrows heavily from their thoughts and is partly a derivative work of their open-source code.

The Clojure collections are licensed under the Eclipse Public License. Versions of them have been included in this project and modified to add type safety and implement different interfaces. These files are still derivative works under the EPL.

Unless otherwise stated, the rest of this work is licensed under the Apache 2.0 license. New contributions should be made under the Apache 2.0 license whenever practical. I believe it is more popular, clearer, and has been better tested in courts of law.

Hermit Crab Photo by Rushen

Contributing

Questions? Ideas? Feedback? Use the Google Group Email List. Clear bugs or simple pull requests can be made on Github without discussing them first on the email list.

If you submit a patch, please:

  • Keep the changes minimal (don't let your IDE reformat whole files).
  • Try to match the code style as best you can.
  • Clearly document your changes.
  • Update the unit tests to clearly and simply prove that your code works.
  • It's a good idea to discuss proposed changes on the email list before you spend time coding.

Build from Source

The pre-built jar file is the easiest way to use Paguro. Users typically only build Paguro from source to make a contribution, or to experiment with the source code.

Prerequisites

Paguro is usually built on Ubuntu 18.04 and later with openjdk-11, git, and maven installed from the official repositories. Being Java it should theoretically build with JDK 11+ on any system.

Environment Variables

Depending on how you installed Java and Maven, you may need to set some of the following in your ~/.profile file and reboot (or source that file like . ~/.profile from the command line you will use for the build). Or do whatever Windows does. If your tools are installed in different directories, you will have to fix the following:

export JDK_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export JAVA_HOME=$JDK_HOME/jre
export M2_HOME=$TOOLS/apache-maven-3.3.9/
export M2="$M2_HOME"bin
export PATH=$PATH:$M2
Build
# Start in an appropriate directory

# You need TestUtils for Paguro's equality testing.
# The first time you build, get a local copy of that and Paguro
git clone https://github.com/GlenKPeterson/Paguro.git

# Build Paguro:
cd Paguro
git pull
mvn clean install

More

Additional information is in: README2.md.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].