Skip to content

Instantly share code, notes, and snippets.

View Lev135's full-sized avatar
📚
Studying mathematics

Lev Dvorkin Lev135

📚
Studying mathematics
  • 15:24 (UTC +03:00)
View GitHub Profile
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)
@Lev135
Lev135 / Optics.hs
Created July 12, 2023 09:16
Profunctor optics, obtained by the same template
{-# 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
@Lev135
Lev135 / Optics.md
Last active October 7, 2023 10:41
Writing profunctor optics by the same template

Writing profunctor optics by the same template

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
@Lev135
Lev135 / AbstractOptic.hs
Created July 12, 2023 12:56
Abstraction over profunctor optics' kinds
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE InstanceSigs #-}