# optics-operators
[![build](https://github.com/qwbarch/optics-operators/actions/workflows/build.yml/badge.svg)](https://github.com/qwbarch/optics-operators/actions/workflows/build.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) [![Hackage](http://img.shields.io/hackage/v/optics-operators.svg)](https://hackage.haskell.org/package/optics-operators)
A tiny package containing operators missing from the official package.
## Why does this package exist?
The [optics](https://hackage.haskell.org/package/optics) library is missing convenient operators that the [lens](https://hackage.haskell.org/package/lens-5.2.2/docs/Control-Lens-Operators.html)
library provides.
I've only added the operators I need for now. Feel free to open an issue or pull request to add new ones.
## Quick start
This is a literate haskell file. You can run this example via the following:
```
nix develop --command cabal run
```
Necessary language extensions and imports for the example:
```haskell
{-# LANGUAGE DeriveGeneric, OverloadedLabels #-}
import GHC.Generics (Generic)
import Control.Monad.State (State, execState)
import Data.Optics.Operators ((+=), (-=), (*=))
```
Basic example using state operators:
```haskell
newtype Person = Person
{ age :: Int
} deriving (Show, Generic)
addAge :: Int -> State Person ()
addAge age = #age += age
subtractAge :: Int -> State Person ()
subtractAge age = #age -= age
```
Running the example:
```haskell
person :: Person
person = Person 50
main :: IO ()
main = print . flip execState person $ do
addAge 10
subtractAge 20
#age *= 2
-- Output: Person {age = 80}
```