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 #-} |