All of the profunctor optics kind have the same, very simple, pattern:
type AnOptic p s t a b = p a b -> p s t
type Optic c s t a b = forall p. c p => AnOptic p s t a b
type Iso s t a b = Optic Profunctor s t a b| Benchmark bench-trans-speed: RUNNING... | |
| benchmarking 1/20 modify/pure/2000 | |
| time 1.033 μs (1.022 μs .. 1.052 μs) | |
| 0.991 R² (0.981 R² .. 0.997 R²) | |
| mean 1.130 μs (1.084 μs .. 1.207 μs) | |
| std dev 182.7 ns (129.1 ns .. 265.3 ns) | |
| variance introduced by outliers: 95% (severely inflated) | |
| benchmarking 1/20 modify/ParserT State/2000 | |
| time 1.250 μs (1.236 μs .. 1.264 μs) |
| {-# OPTIONS_GHC -Wall #-} | |
| {-# LANGUAGE RankNTypes #-} | |
| {-# LANGUAGE ConstraintKinds #-} | |
| {-# LANGUAGE MultiParamTypeClasses #-} | |
| {-# LANGUAGE FlexibleInstances #-} | |
| import Control.Monad | |
| import Data.Bifunctor | |
| type AnOptic p s t a b = p a b -> p s t |
| {-# LANGUAGE TypeFamilies #-} | |
| {-# LANGUAGE AllowAmbiguousTypes #-} | |
| {-# LANGUAGE TypeApplications #-} | |
| {-# LANGUAGE ScopedTypeVariables #-} | |
| {-# LANGUAGE RankNTypes #-} | |
| {-# LANGUAGE MultiParamTypeClasses #-} | |
| {-# LANGUAGE FlexibleContexts #-} | |
| {-# LANGUAGE FlexibleInstances #-} | |
| {-# LANGUAGE InstanceSigs #-} |