{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes            #-}

-- |
-- Module      : Network.OAuth.MuLens
-- Copyright   : (c) Joseph Abrahamson 2013
-- License     : MIT
--
-- Maintainer  : me@jspha.com
-- Stability   : experimental
-- Portability : non-portable
--
-- Tiny, @Control.Lens@ compatibility layer.

module Network.OAuth.MuLens (
  -- * Basics
  view, set,
  -- * Generalizations
  over, foldMapOf,
  -- * Building
  (<&>), (&), (^.), (.~), (%~),
  ) where

import           Data.Functor.Identity
import           Data.Functor.Constant

view :: ((a -> Constant a a) -> s -> Constant a s) -> s -> a
view :: ((a -> Constant a a) -> s -> Constant a s) -> s -> a
view (a -> Constant a a) -> s -> Constant a s
inj = ((a -> Constant a a) -> s -> Constant a s) -> (a -> a) -> s -> a
forall a r b s t.
((a -> Constant r b) -> s -> Constant r t) -> (a -> r) -> s -> r
foldMapOf (a -> Constant a a) -> s -> Constant a s
inj a -> a
forall a. a -> a
id
{-# INLINE view #-}

over :: ((a -> Identity b) -> s -> Identity t) -> (a -> b) -> s -> t
over :: ((a -> Identity b) -> s -> Identity t) -> (a -> b) -> s -> t
over (a -> Identity b) -> s -> Identity t
inj a -> b
f = Identity t -> t
forall a. Identity a -> a
runIdentity (Identity t -> t) -> (s -> Identity t) -> s -> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Identity b) -> s -> Identity t
inj (b -> Identity b
forall a. a -> Identity a
Identity (b -> Identity b) -> (a -> b) -> a -> Identity b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f)
{-# INLINE over #-}

set :: ((a -> Identity b) -> s -> Identity t) -> b -> s -> t
set :: ((a -> Identity b) -> s -> Identity t) -> b -> s -> t
set (a -> Identity b) -> s -> Identity t
l = ((a -> Identity b) -> s -> Identity t) -> (a -> b) -> s -> t
forall a b s t.
((a -> Identity b) -> s -> Identity t) -> (a -> b) -> s -> t
over (a -> Identity b) -> s -> Identity t
l ((a -> b) -> s -> t) -> (b -> a -> b) -> b -> s -> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> a -> b
forall a b. a -> b -> a
const
{-# INLINE set #-}

foldMapOf :: ((a -> Constant r b) -> s -> Constant r t) -> (a -> r) -> s -> r
foldMapOf :: ((a -> Constant r b) -> s -> Constant r t) -> (a -> r) -> s -> r
foldMapOf (a -> Constant r b) -> s -> Constant r t
inj a -> r
f = Constant r t -> r
forall a k (b :: k). Constant a b -> a
getConstant (Constant r t -> r) -> (s -> Constant r t) -> s -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Constant r b) -> s -> Constant r t
inj (r -> Constant r b
forall k a (b :: k). a -> Constant a b
Constant (r -> Constant r b) -> (a -> r) -> a -> Constant r b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> r
f)
{-# INLINE foldMapOf #-}

infixl 5 <&>
(<&>) :: Functor f => f a -> (a -> b) -> f b
<&> :: f a -> (a -> b) -> f b
(<&>) = ((a -> b) -> f a -> f b) -> f a -> (a -> b) -> f b
forall a b c. (a -> b -> c) -> b -> a -> c
flip (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
(<$>)
{-# INLINE (<&>) #-}

infixl 1 &
(&) :: b -> (b -> c) -> c
& :: b -> (b -> c) -> c
(&) = ((b -> c) -> b -> c) -> b -> (b -> c) -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip (b -> c) -> b -> c
forall a b. (a -> b) -> a -> b
($)
{-# INLINE (&) #-}

infixl 8 ^.
(^.) ::  s -> ((a -> Constant a a) -> s -> Constant a s) -> a
^. :: s -> ((a -> Constant a a) -> s -> Constant a s) -> a
(^.) = (((a -> Constant a a) -> s -> Constant a s) -> s -> a)
-> s -> ((a -> Constant a a) -> s -> Constant a s) -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> Constant a a) -> s -> Constant a s) -> s -> a
forall a s. ((a -> Constant a a) -> s -> Constant a s) -> s -> a
view
{-# INLINE (^.) #-}

infixr 4 .~
(.~) :: ((a -> Identity b) -> s -> Identity t) -> b -> s -> t
.~ :: ((a -> Identity b) -> s -> Identity t) -> b -> s -> t
(.~) = ((a -> Identity b) -> s -> Identity t) -> b -> s -> t
forall a b s t.
((a -> Identity b) -> s -> Identity t) -> b -> s -> t
set
{-# INLINE (.~) #-}

infixr 4 %~
(%~) :: ((a -> Identity b) -> s -> Identity t) -> (a -> b) -> s -> t
%~ :: ((a -> Identity b) -> s -> Identity t) -> (a -> b) -> s -> t
(%~) = ((a -> Identity b) -> s -> Identity t) -> (a -> b) -> s -> t
forall a b s t.
((a -> Identity b) -> s -> Identity t) -> (a -> b) -> s -> t
over
{-# INLINE (%~) #-}