<NME> README.md
<BEF> # Functors, Applicatives, And Monads in Python

![Python package](https://github.com/dbrattli/OSlash/workflows/Python%20package/badge.svg)

OSlash (Ø) is a library for playing with functional programming in Python 3.8+. It's an attempt to re-implement some of
the code from [Learn You a Haskell for Great Good!](http://learnyouahaskell.com/) in Python 3.8. OSlash unifies
functional and object oriented paradigms by grouping related functions within classes. Objects are however never used
for storing values or mutable data, and data only lives within function closures.

OSlash is intended to be a tutorial. For practical functional programming in Python in production environments you
should use [Expression](https://github.com/dbrattli/Expression) instead.

## Install

```bash
> pip3 install oslash
```

The project currently contains implementations for:

## Abstract Base Classes

- **[Functor](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#functors)**, for stuff that can be mapped
you implement things yourself. The code may be similar to PyMonad in structure, 
but is quite different in implementation.

Why is the project called Ø? Ø is the Norwegian character called 
[Oslash](http://en.wikipedia.org/wiki/Ø). Just want to check if it's possible 
to have a projects name that uses unicode characters. 
Q: How do I write an ø on an american or english keybord?
A: Are you really sure you want to understand Monads? Copy/paste?

## Examples

- **[IO Action](https://github.com/dbrattli/OSlash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures#io-monad)**, for impure stuff
- **[Writer](https://github.com/dbrattli/OSlash/wiki/Three-Useful-Monads#the-writer-monad)**, for logging stuff
- **[Reader](https://github.com/dbrattli/OSlash/wiki/Three-Useful-Monads#the-reader-monad)**, for callable stuff
- **State**, for stateful computations of stuff
- **Cont**, for continuation of stuff

## Monadic functions

- **>>**, for sequencing monadic actions
- **lift**, for mapping a function over monadic values
- **join**, for removing one level of monadic structure
- **compose**, for composing monadic functions

## Utility functions

- **compose**, for composing 0 to n functions

```

## Tutorial

You might already have checked out the excellent [Functors, Applicatives, And Monads In Pictures](adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html).

How would that look if we translated it to Python? Well, here is
[Functors, Applicatives, And Monads In Pictures](https://github.com/dbrattli/oslash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures) in Python.
Python:

```python
>>> Just(2).map(lambda x: x+3)
Just 5

>>> (lambda x: x+3) % Just(2)
Just 5

```

IO Actions:

```python
from oslash import put_line, get_line

main = put_line("What is your name?") | (lambda _:
    get_line() | (lambda name:
    put_line("What is your age?") | (lambda _:
    get_line() | (lambda age:
    put_line("Hello " + name + "!") | (lambda _:
    put_line("You are " + age + " years old"))))))

if __name__ == "__main__":
    main()
```

## Tutorials

- [Functors, Applicatives, And Monads In Pictures](https://github.com/dbrattli/oslash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures) in Python.
- [Three Useful Monads](https://github.com/dbrattli/OSlash/wiki/Three-Useful-Monads) _(in progress)_
- [Using Either monad in Python](https://medium.com/@rnesytov/using-either-monad-in-python-b6eac698dff5)

<MSG> Updated readme

<DFF> @@ -24,11 +24,10 @@ this in order to better understand the book. It's so much easier to learn when
 you implement things yourself. The code may be similar to PyMonad in structure, 
 but is quite different in implementation.
 
-Why is the project called Ø? Ø is the Norwegian character called 
-[Oslash](http://en.wikipedia.org/wiki/Ø). Just want to check if it's possible 
-to have a projects name that uses unicode characters. 
-Q: How do I write an ø on an american or english keybord?
-A: Are you really sure you want to understand Monads? Copy/paste?
+Why is the project called OSlash? OSlash is the Norwegian character called 
+[Oslash](http://en.wikipedia.org/wiki/Ø). Initially I wanted to create a 
+project that used Ø and ø (unicode) for the project name and modules. It didn't 
+work out well, so I renamed it to Oslash. 
 
 ## Examples
 
@@ -51,9 +50,24 @@ Just 5
 
 ```
 
-## Tutorial
+IO Actions:
+
+```python
+from oslash import put_line, get_line
+
+main = put_line("What is your name?") >> (lambda _:
+    get_line() >> (lambda name:
+    put_line("What is your age?") >> (lambda _:
+    get_line() >> (lambda age:
+    put_line("Hello " + name + "!") >> (lambda _:
+    put_line("You are " + age + " years old"))))))
 
-You might already have checked out the excellent [Functors, Applicatives, And Monads In Pictures](adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html).
+if __name__ == "__main__":
+    main()
+```
+
+## Tutorial
 
-How would that look if we translated it to Python? Well, here is
-[Functors, Applicatives, And Monads In Pictures](https://github.com/dbrattli/oslash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures) in Python.
+Please take a look at the [Functors, Applicatives, And Monads In Pictures](https://github.com/dbrattli/oslash/wiki/Functors,-Applicatives,-And-Monads-In-Pictures) 
+in Python. It's a translation of the excellent [Functors, Applicatives, And Monads In Pictures](adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html) 
+in Haskell.

Updated readme