{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Profunctor.Optic.Prelude (
re
, invert
, (&)
, (.)
, (%)
, (#)
, view
, (^.)
, iview
, (^%)
, review
, (#^)
, set
, (.~)
, iset
, (%~)
, kset
, (#~)
, over
, (..~)
, iover
, (%%~)
, kover
, (##~)
, (<>~)
, preview
, (^?)
, is
, isnt
, matches
, lists
, (^..)
, ilists
, ilistsFrom
, (^%%)
, folds
, foldsa
, foldsr
, ifoldsr
, ifoldsrFrom
, foldsl
, ifoldsl
, ifoldslFrom
, foldsr'
, ifoldsr'
, foldsl'
, ifoldsl'
, foldsrM
, ifoldsrM
, foldslM
, ifoldslM
, traverses_
, itraverses_
, sums
, multiplies
, asums
, concats
, iconcats
, endo
, endoM
, finds
, ifinds
, has
, hasnt
, elem
, pelem
, joins
, joins'
, meets
, meets'
, mins
, maxes
) where
import Control.Monad.Reader as Reader hiding (lift)
import Data.Function
import Data.Maybe
import Data.Monoid
import Data.Profunctor.Optic.Carrier
import Data.Profunctor.Optic.Types
import Data.Profunctor.Optic.Iso
import Data.Profunctor.Optic.View
import Data.Profunctor.Optic.Import
import Data.Profunctor.Optic.Index
import Data.Profunctor.Optic.Setter
import Data.Profunctor.Optic.Fold
import Data.Profunctor.Optic.Option
import Data.Profunctor.Optic.Affine
import Data.Prd (Prd, Minimal(..), Maximal(..))
import Data.Semilattice
import qualified Control.Applicative as A
import Data.Semiring as Rng
import qualified Prelude as Pre
sums :: (Additive-Monoid) a => AFold ((Endo-Endo) a) s a -> s -> a
sums o = foldsl' o (+) zero
multiplies :: (Multiplicative-Monoid) a => AFold ((Endo-Endo) a) s a -> s -> a
multiplies o = foldsl' o (*) one
asums :: Alternative f => AFold ((Endo-Endo) (f a)) s (f a) -> s -> f a
asums o = foldsl' o (<|>) A.empty
{-# INLINE asums #-}
concats :: AFold [r] s a -> (a -> [r]) -> s -> [r]
concats = withFold
{-# INLINE concats #-}
iconcats :: (Additive-Monoid) i => AIxfold [r] i s a -> (i -> a -> [r]) -> s -> [r]
iconcats o f = withIxfold o f zero
{-# INLINE iconcats #-}
endo :: AFold (Endo (a -> a)) s (a -> a) -> s -> a -> a
endo o = foldsr o (.) id
endoM :: Monad m => AFold (Endo (a -> m a)) s (a -> m a) -> s -> a -> m a
endoM o = foldsr o (<=<) pure
finds :: AFold ((Maybe-Endo) a) s a -> (a -> Bool) -> s -> Maybe a
finds o f = foldsr o (\a y -> if f a then Just a else y) Nothing
{-# INLINE finds #-}
ifinds :: (Additive-Monoid) i => AIxfold ((Maybe-Endo) (i, a)) i s a -> (i -> a -> Bool) -> s -> Maybe (i, a)
ifinds o f = ifoldsr o (\i a y -> if f i a then Just (i,a) else y) Nothing
{-# INLINE ifinds #-}
has :: AFold (Additive Bool) s a -> s -> Bool
has o s = unAdditive $ withFold o (const $ Additive True) s
{-# INLINE has #-}
hasnt :: AFold (Multiplicative Bool) s a -> s -> Bool
hasnt o s = unMultiplicative $ withFold o (const $ Multiplicative False) s
{-# INLINE hasnt #-}
elem :: Eq a => AFold (Additive Bool) s a -> a -> s -> Bool
elem o a s = unAdditive $ withFold o (\x -> Additive $ x == a) s
pelem :: Prd a => AFold (Additive Bool) s a -> a -> s -> Bool
pelem o a s = unAdditive $ withFold o (\x -> Additive $ x =~ a) s
{-# INLINE pelem #-}
mins :: Pre.Ord a => AFold ((Endo-Endo) a) s a -> a -> s -> a
mins o = foldsl' o Pre.min
maxes :: Pre.Ord a => AFold ((Endo-Endo) a) s a -> a -> s -> a
maxes o = foldsl' o Pre.max
joins :: Lattice a => AFold ((Endo-Endo) a) s a -> a -> s -> a
joins o = foldsl' o (∨)
{-# INLINE joins #-}
joins' :: Lattice a => Minimal a => AFold ((Endo-Endo) a) s a -> s -> a
joins' o = joins o minimal
{-# INLINE joins' #-}
meets :: Lattice a => AFold ((Endo-Endo) a) s a -> a -> s -> a
meets o = foldsl' o (∧)
{-# INLINE meets #-}
meets' :: Lattice a => Maximal a => AFold ((Endo-Endo) a) s a -> s -> a
meets' o = meets o maximal
{-# INLINE meets' #-}