module Lens.Explicit (
to, Getter, AGetter, (^.)
, sets, Setter, ASetter, (%~), (.~), Setter'
, lens, Lens, ALens, (%%~), Lens'
, prism, Prism, APrism, matching, Prism'
, unto, Review, AReview, re
, iso, Iso, AnIso, from, under, Iso'
, folded, Fold, AFold, foldMapOf
, traversed, Traversal, ATraversal, traverseOf, Traversal'
, Cat.id, (Cat..), (&)
) where
import qualified Lens.Explicit.Core as Π
import Lens.Explicit.Core (OpticC(..))
import Prelude hiding (id, (.))
import Control.Category as Cat
import Data.Function hiding (id, (.))
infixl 8 ^.
(^.) :: π -> AGetter π π -> π
s ^. Π.Equality = s
s ^. OpticC (Π.Getter f) = f s
to :: (π -> π) -> Getter π π
to = OpticC . Π.to
type Getter π π = Π.Getter π π π π
type AGetter π π = Π.AGetter π π
infixr 4 %~, .~
(%~) :: ASetter π π‘ π π -> (π -> π) -> π -> π‘
Π.Equality %~ m = m
OpticC (Π.Setter f) %~ m = f m
(.~) :: ASetter π π‘ π π -> π -> π -> π‘
a .~ b = a %~ const b
sets :: ((π -> π) -> π -> π‘) -> Setter π π‘ π π
sets = OpticC . Π.sets
type Setter π π‘ π π = Π.Setter π π‘ π π
type ASetter π π‘ π π = Π.ASetter π π‘ π π
type Setter' π π = Setter π π π π
infixr 4 %%~
(%%~) :: Functor π => ALens π π‘ π π -> (π -> π π) -> π -> π π‘
(%%~) Π.Equality Ο s = Ο s
(%%~) (OpticC (Π.Lens f Ο)) Ο s = fmap (Ο s) . Ο $ f s
lens :: (π -> π) -> (π -> π -> π‘) -> Lens π π‘ π π
lens f g = OpticC $ Π.lens f g
type Lens π π‘ π π = Π.Lens π π‘ π π
type ALens π π‘ π π = Π.ALens π π‘ π π
type Lens' π π = Lens π π π π
prism :: (π -> π‘) -> (π -> Either π‘ π) -> Prism π π‘ π π
prism f g = OpticC $ Π.prism f g
matching :: APrism π π‘ π π -> π -> Either π‘ π
matching Π.Equality = Right
matching (OpticC (Π.Prism _ f)) = f
type Prism π π‘ π π = Π.Prism π π‘ π π
type APrism π π‘ π π = Π.APrism π π‘ π π
type Prism' π π = Prism π π π π
unto :: (π -> π‘) -> Review π‘ π
unto = OpticC . Π.unto
re :: Π.FromGetter c => AReview π‘ π -> Π.Optic c π‘ π‘ π π
re Π.Equality = Π.Equality
re (OpticC (Π.Review f)) = OpticC $ Π.to f
type Review π‘ π = Π.Review π‘ π‘ π π
type AReview π‘ π = Π.AReview π‘ π
under :: AnIso π π‘ π π -> (π‘ -> π ) -> π -> π
under Π.Equality g = g
under (OpticC (Π.Iso f Ο)) g = f . g . Ο
from :: AnIso π π‘ π π -> Iso π π π‘ π
from Π.Equality = Π.Equality
from (OpticC (Π.Iso f Ο)) = iso Ο f
iso :: (π -> π) -> (π -> π‘) -> Iso π π‘ π π
iso f g = OpticC $ Π.iso f g
type Iso π π‘ π π = Π.Iso π π‘ π π
type AnIso π π‘ π π = Π.AnIso π π‘ π π
type Iso' π π = Iso π π π π
traverseOf :: Applicative π => ATraversal π π‘ π π -> (π -> π π) -> π -> π π‘
traverseOf Π.Equality = id
traverseOf (OpticC (Π.Traversal y)) = y
traversed :: (β π . Applicative π => (π -> π π) -> π -> π π‘) -> Traversal π π‘ π π
traversed f = OpticC (Π.traversed f)
type Traversal π π‘ π π = Π.Traversal π π‘ π π
type ATraversal π π‘ π π = Π.ATraversal π π‘ π π
type Traversal' π π = Traversal π π π π
foldMapOf :: Monoid π => AFold π π -> (π -> π) -> π -> π
foldMapOf Π.Equality = id
foldMapOf (OpticC (Π.Fold y)) = y
folded :: Foldable π => Fold (π π) π
folded = OpticC $ Π.folded
type Fold π π = Π.Fold π π π π
type AFold π π = Π.AFold π π π π