{-# LANGUAGE RankNTypes #-}
module Distribution.Compat.Lens (
Lens,
Lens',
Traversal,
Traversal',
LensLike,
LensLike',
Getting,
AGetter,
ASetter,
ALens,
ALens',
view,
use,
getting,
set,
over,
toDListOf,
toListOf,
toSetOf,
cloneLens,
aview,
_1, _2,
(&),
(^.),
(.~), (?~), (%~),
(.=), (?=), (%=),
(^#),
(#~), (#%~),
Pretext (..),
) where
import Prelude()
import Distribution.Compat.Prelude
import Control.Applicative (Const (..))
import Data.Functor.Identity (Identity (..))
import Control.Monad.State.Class (MonadState (..), gets, modify)
import qualified Distribution.Compat.DList as DList
import qualified Data.Set as Set
type LensLike f s t a b = (a -> f b) -> s -> f t
type LensLike' f s a = (a -> f a) -> s -> f s
type Lens s t a b = forall f. Functor f => LensLike f s t a b
type Traversal s t a b = forall f. Applicative f => LensLike f s t a b
type Lens' s a = Lens s s a a
type Traversal' s a = Traversal s s a a
type Getting r s a = LensLike (Const r) s s a a
type AGetter s a = LensLike (Const a) s s a a
type ASetter s t a b = LensLike Identity s t a b
type ALens s t a b = LensLike (Pretext a b) s t a b
type ALens' s a = ALens s s a a
view :: Getting a s a -> s -> a
view :: Getting a s a -> s -> a
view Getting a s a
l s
s = Const a s -> a
forall a k (b :: k). Const a b -> a
getConst (Getting a s a
l a -> Const a a
forall k a (b :: k). a -> Const a b
Const s
s)
{-# INLINE view #-}
use :: MonadState s m => Getting a s a -> m a
use :: Getting a s a -> m a
use Getting a s a
l = (s -> a) -> m a
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets (Getting a s a -> s -> a
forall a s. Getting a s a -> s -> a
view Getting a s a
l)
{-# INLINE use #-}
getting :: (s -> a) -> Getting r s a
getting :: (s -> a) -> Getting r s a
getting s -> a
k a -> Const r a
f = r -> Const r s
forall k a (b :: k). a -> Const a b
Const (r -> Const r s) -> (s -> r) -> s -> Const r s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Const r a -> r
forall a k (b :: k). Const a b -> a
getConst (Const r a -> r) -> (s -> Const r a) -> s -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Const r a
f (a -> Const r a) -> (s -> a) -> s -> Const r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> a
k
{-# INLINE getting #-}
set :: ASetter s t a b -> b -> s -> t
set :: ASetter s t a b -> b -> s -> t
set ASetter s t a b
l b
x = ASetter s t a b -> (a -> b) -> s -> t
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter s t a b
l (b -> a -> b
forall a b. a -> b -> a
const b
x)
over :: ASetter s t a b -> (a -> b) -> s -> t
over :: ASetter s t a b -> (a -> b) -> s -> t
over ASetter s t a b
l a -> b
f s
s = Identity t -> t
forall a. Identity a -> a
runIdentity (ASetter s t a b
l (\a
x -> b -> Identity b
forall a. a -> Identity a
Identity (a -> b
f a
x)) s
s)
toDListOf :: Getting (DList.DList a) s a -> s -> DList.DList a
toDListOf :: Getting (DList a) s a -> s -> DList a
toDListOf Getting (DList a) s a
l s
s = Const (DList a) s -> DList a
forall a k (b :: k). Const a b -> a
getConst (Getting (DList a) s a
l (\a
x -> DList a -> Const (DList a) a
forall k a (b :: k). a -> Const a b
Const (a -> DList a
forall a. a -> DList a
DList.singleton a
x)) s
s)
toListOf :: Getting (DList.DList a) s a -> s -> [a]
toListOf :: Getting (DList a) s a -> s -> [a]
toListOf Getting (DList a) s a
l = DList a -> [a]
forall a. DList a -> [a]
DList.runDList (DList a -> [a]) -> (s -> DList a) -> s -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting (DList a) s a -> s -> DList a
forall a s. Getting (DList a) s a -> s -> DList a
toDListOf Getting (DList a) s a
l
toSetOf :: Getting (Set.Set a) s a -> s -> Set.Set a
toSetOf :: Getting (Set a) s a -> s -> Set a
toSetOf Getting (Set a) s a
l s
s = Const (Set a) s -> Set a
forall a k (b :: k). Const a b -> a
getConst (Getting (Set a) s a
l (\a
x -> Set a -> Const (Set a) a
forall k a (b :: k). a -> Const a b
Const (a -> Set a
forall a. a -> Set a
Set.singleton a
x)) s
s)
aview :: ALens s t a b -> s -> a
aview :: ALens s t a b -> s -> a
aview ALens s t a b
l = Pretext a b t -> a
forall a b t. Pretext a b t -> a
pretextPos (Pretext a b t -> a) -> (s -> Pretext a b t) -> s -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ALens s t a b
l a -> Pretext a b b
forall a b. a -> Pretext a b b
pretextSell
{-# INLINE aview #-}
_1 :: Lens (a, c) (b, c) a b
_1 :: LensLike f (a, c) (b, c) a b
_1 a -> f b
f (a
a, c
c) = (b -> c -> (b, c)) -> c -> b -> (b, c)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (,) c
c (b -> (b, c)) -> f b -> f (b, c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f b
f a
a
_2 :: Lens (c, a) (c, b) a b
_2 :: LensLike f (c, a) (c, b) a b
_2 a -> f b
f (c
c, a
a) = (,) c
c (b -> (c, b)) -> f b -> f (c, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f b
f a
a
(&) :: a -> (a -> b) -> b
& :: a -> (a -> b) -> b
(&) = ((a -> b) -> a -> b) -> a -> (a -> b) -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
($)
{-# INLINE (&) #-}
infixl 1 &
infixl 8 ^., ^#
infixr 4 .~, %~, ?~
infixr 4 #~, #%~
infixr 4 .=, %=, ?=
(^.) :: s -> Getting a s a -> a
s
s ^. :: s -> Getting a s a -> a
^. Getting a s a
l = Const a s -> a
forall a k (b :: k). Const a b -> a
getConst (Getting a s a
l a -> Const a a
forall k a (b :: k). a -> Const a b
Const s
s)
{-# INLINE (^.) #-}
(.~) :: ASetter s t a b -> b -> s -> t
.~ :: ASetter s t a b -> b -> s -> t
(.~) = ASetter s t a b -> b -> s -> t
forall s t a b. ASetter s t a b -> b -> s -> t
set
{-# INLINE (.~) #-}
(?~) :: ASetter s t a (Maybe b) -> b -> s -> t
ASetter s t a (Maybe b)
l ?~ :: ASetter s t a (Maybe b) -> b -> s -> t
?~ b
b = ASetter s t a (Maybe b) -> Maybe b -> s -> t
forall s t a b. ASetter s t a b -> b -> s -> t
set ASetter s t a (Maybe b)
l (b -> Maybe b
forall a. a -> Maybe a
Just b
b)
{-# INLINE (?~) #-}
(%~) :: ASetter s t a b -> (a -> b) -> s -> t
%~ :: ASetter s t a b -> (a -> b) -> s -> t
(%~) = ASetter s t a b -> (a -> b) -> s -> t
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over
{-# INLINE (%~) #-}
(.=) :: MonadState s m => ASetter s s a b -> b -> m ()
ASetter s s a b
l .= :: ASetter s s a b -> b -> m ()
.= b
b = (s -> s) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (ASetter s s a b
l ASetter s s a b -> b -> s -> s
forall s t a b. ASetter s t a b -> b -> s -> t
.~ b
b)
{-# INLINE (.=) #-}
(?=) :: MonadState s m => ASetter s s a (Maybe b) -> b -> m ()
ASetter s s a (Maybe b)
l ?= :: ASetter s s a (Maybe b) -> b -> m ()
?= b
b = (s -> s) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (ASetter s s a (Maybe b)
l ASetter s s a (Maybe b) -> b -> s -> s
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ b
b)
{-# INLINE (?=) #-}
(%=) :: MonadState s m => ASetter s s a b -> (a -> b) -> m ()
ASetter s s a b
l %= :: ASetter s s a b -> (a -> b) -> m ()
%= a -> b
f = (s -> s) -> m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (ASetter s s a b
l ASetter s s a b -> (a -> b) -> s -> s
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ a -> b
f)
{-# INLINE (%=) #-}
(^#) :: s -> ALens s t a b -> a
s
s ^# :: s -> ALens s t a b -> a
^# ALens s t a b
l = ALens s t a b -> s -> a
forall s t a b. ALens s t a b -> s -> a
aview ALens s t a b
l s
s
(#~) :: ALens s t a b -> b -> s -> t
#~ :: ALens s t a b -> b -> s -> t
(#~) ALens s t a b
l b
b s
s = b -> Pretext a b t -> t
forall b a t. b -> Pretext a b t -> t
pretextPeek b
b (ALens s t a b
l a -> Pretext a b b
forall a b. a -> Pretext a b b
pretextSell s
s)
{-# INLINE (#~) #-}
(#%~) :: ALens s t a b -> (a -> b) -> s -> t
#%~ :: ALens s t a b -> (a -> b) -> s -> t
(#%~) ALens s t a b
l a -> b
f s
s = (a -> b) -> Pretext a b t -> t
forall a b t. (a -> b) -> Pretext a b t -> t
pretextPeeks a -> b
f (ALens s t a b
l a -> Pretext a b b
forall a b. a -> Pretext a b b
pretextSell s
s)
{-# INLINE (#%~) #-}
pretextSell :: a -> Pretext a b b
pretextSell :: a -> Pretext a b b
pretextSell a
a = (forall (f :: * -> *). Functor f => (a -> f b) -> f b)
-> Pretext a b b
forall a b t.
(forall (f :: * -> *). Functor f => (a -> f b) -> f t)
-> Pretext a b t
Pretext (\a -> f b
afb -> a -> f b
afb a
a)
{-# INLINE pretextSell #-}
pretextPeeks :: (a -> b) -> Pretext a b t -> t
pretextPeeks :: (a -> b) -> Pretext a b t -> t
pretextPeeks a -> b
f (Pretext forall (f :: * -> *). Functor f => (a -> f b) -> f t
m) = Identity t -> t
forall a. Identity a -> a
runIdentity (Identity t -> t) -> Identity t -> t
forall a b. (a -> b) -> a -> b
$ (a -> Identity b) -> Identity t
forall (f :: * -> *). Functor f => (a -> f b) -> f t
m (\a
x -> b -> Identity b
forall a. a -> Identity a
Identity (a -> b
f a
x))
{-# INLINE pretextPeeks #-}
pretextPeek :: b -> Pretext a b t -> t
pretextPeek :: b -> Pretext a b t -> t
pretextPeek b
b (Pretext forall (f :: * -> *). Functor f => (a -> f b) -> f t
m) = Identity t -> t
forall a. Identity a -> a
runIdentity (Identity t -> t) -> Identity t -> t
forall a b. (a -> b) -> a -> b
$ (a -> Identity b) -> Identity t
forall (f :: * -> *). Functor f => (a -> f b) -> f t
m (\a
_ -> b -> Identity b
forall a. a -> Identity a
Identity b
b)
{-# INLINE pretextPeek #-}
pretextPos :: Pretext a b t -> a
pretextPos :: Pretext a b t -> a
pretextPos (Pretext forall (f :: * -> *). Functor f => (a -> f b) -> f t
m) = Const a t -> a
forall a k (b :: k). Const a b -> a
getConst ((a -> Const a b) -> Const a t
forall (f :: * -> *). Functor f => (a -> f b) -> f t
m a -> Const a b
forall k a (b :: k). a -> Const a b
Const)
{-# INLINE pretextPos #-}
cloneLens :: Functor f => ALens s t a b -> LensLike f s t a b
cloneLens :: ALens s t a b -> LensLike f s t a b
cloneLens ALens s t a b
l a -> f b
f s
s = Pretext a b t -> (a -> f b) -> f t
forall a b t.
Pretext a b t
-> forall (f :: * -> *). Functor f => (a -> f b) -> f t
runPretext (ALens s t a b
l a -> Pretext a b b
forall a b. a -> Pretext a b b
pretextSell s
s) a -> f b
f
{-# INLINE cloneLens #-}
data Pretext a b t = Pretext { Pretext a b t
-> forall (f :: * -> *). Functor f => (a -> f b) -> f t
runPretext :: forall f. Functor f => (a -> f b) -> f t }
instance Functor (Pretext a b) where
fmap :: (a -> b) -> Pretext a b a -> Pretext a b b
fmap a -> b
f (Pretext forall (f :: * -> *). Functor f => (a -> f b) -> f a
pretext) = (forall (f :: * -> *). Functor f => (a -> f b) -> f b)
-> Pretext a b b
forall a b t.
(forall (f :: * -> *). Functor f => (a -> f b) -> f t)
-> Pretext a b t
Pretext (\a -> f b
afb -> (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f ((a -> f b) -> f a
forall (f :: * -> *). Functor f => (a -> f b) -> f a
pretext a -> f b
afb))