module Cooked.Tweak.Modify
(
Branching (..),
ModifyTweakParams (..),
modifyTweakParamsAllIndexes,
modifyTweakParamsNoTypeChange,
modifyTweakParamsOneBranchForAllFoci,
modifyTweakParamsOneBranchPerFoci,
modifyTweakParamsOneBranchPerSubset,
modifyTweak,
modifyTweakFromParams,
selectP,
)
where
import Control.Applicative (Alternative)
import Control.Monad
import Cooked.Skeleton
import Cooked.Tweak.Common
import Cooked.Tweak.Query
import Cooked.Tweak.Update
import Data.Either (isRight)
import Data.Either.Combinators (fromRight')
import Data.List (subsequences)
import Data.Set qualified as Set
import Optics.Core
import Polysemy
import Polysemy.NonDet
import Polysemy.Writer
selectP ::
(a -> Bool) ->
Prism' a a
selectP :: forall a. (a -> Bool) -> Prism' a a
selectP a -> Bool
prop = (a -> a) -> (a -> Maybe a) -> Prism a a a a
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism' a -> a
forall a. a -> a
id ((a -> Bool) -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => (a -> Bool) -> m a -> m a
mfilter a -> Bool
prop (Maybe a -> Maybe a) -> (a -> Maybe a) -> a -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Maybe a
forall a. a -> Maybe a
Just)
modifyTweak ::
( Ord is,
Is k A_Traversal,
Members '[Tweak, NonDet] effs
) =>
([is] -> [[is]]) ->
Optic' k (WithIx is) TxSkel x ->
(is -> x -> Sem effs (x, l)) ->
Sem effs [l]
modifyTweak :: forall is k (effs :: EffectRow) x l.
(Ord is, Is k A_Traversal, Members '[Tweak, NonDet] effs) =>
([is] -> [[is]])
-> Optic' k (WithIx is) TxSkel x
-> (is -> x -> Sem effs (x, l))
-> Sem effs [l]
modifyTweak [is] -> [[is]]
groupings Optic' k (WithIx is) TxSkel x
optic is -> x -> Sem effs (x, l)
changes = do
let tOptic :: Optic A_Traversal (WithIx is) TxSkel TxSkel x x
tOptic = forall destKind srcKind (is :: IxList) s t a b.
Is srcKind destKind =>
Optic srcKind is s t a b -> Optic destKind is s t a b
castOptic @A_Traversal Optic' k (WithIx is) TxSkel x
optic
[[is]]
indexes <- Optic' A_Getter '[] TxSkel [[is]] -> Sem effs [[is]]
forall (effs :: EffectRow) k (is :: IxList) a.
(Member Tweak effs, Is k A_Getter) =>
Optic' k is TxSkel a -> Sem effs a
viewTweak (Optic' A_Getter '[] TxSkel [[is]] -> Sem effs [[is]])
-> Optic' A_Getter '[] TxSkel [[is]] -> Sem effs [[is]]
forall a b. (a -> b) -> a -> b
$ (TxSkel -> [[is]]) -> Optic' A_Getter '[] TxSkel [[is]]
forall s a. (s -> a) -> Getter s a
to ((TxSkel -> [[is]]) -> Optic' A_Getter '[] TxSkel [[is]])
-> (TxSkel -> [[is]]) -> Optic' A_Getter '[] TxSkel [[is]]
forall a b. (a -> b) -> a -> b
$ ([is] -> Bool) -> [[is]] -> [[is]]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> ([is] -> Bool) -> [is] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [is] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ([[is]] -> [[is]]) -> (TxSkel -> [[is]]) -> TxSkel -> [[is]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [is] -> [[is]]
groupings ([is] -> [[is]]) -> (TxSkel -> [is]) -> TxSkel -> [[is]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((is, x) -> is) -> [(is, x)] -> [is]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (is, x) -> is
forall a b. (a, b) -> a
fst ([(is, x)] -> [is]) -> (TxSkel -> [(is, x)]) -> TxSkel -> [is]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Optic A_Traversal (WithIx is) TxSkel TxSkel x x
-> TxSkel -> [(is, x)]
forall k (is :: IxList) i s a.
(Is k A_Fold, HasSingleIndex is i) =>
Optic' k is s a -> s -> [(i, a)]
itoListOf Optic A_Traversal (WithIx is) TxSkel TxSkel x x
tOptic
[Sem effs [l]] -> Sem effs [l]
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum ([Sem effs [l]] -> Sem effs [l]) -> [Sem effs [l]] -> Sem effs [l]
forall a b. (a -> b) -> a -> b
$
[[is]]
indexes
[[is]] -> ([is] -> Sem effs [l]) -> [Sem effs [l]]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \([is] -> Set is
forall a. Ord a => [a] -> Set a
Set.fromList -> Set is
grouping) -> do
(([l], ()) -> [l]) -> Sem effs ([l], ()) -> Sem effs [l]
forall a b. (a -> b) -> Sem effs a -> Sem effs b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([l], ()) -> [l]
forall a b. (a, b) -> a
fst (Sem effs ([l], ()) -> Sem effs [l])
-> Sem effs ([l], ()) -> Sem effs [l]
forall a b. (a -> b) -> a -> b
$ Sem (Writer [l] : effs) () -> Sem effs ([l], ())
forall o (r :: EffectRow) a.
Monoid o =>
Sem (Writer o : r) a -> Sem r (o, a)
runWriter (Sem (Writer [l] : effs) () -> Sem effs ([l], ()))
-> Sem (Writer [l] : effs) () -> Sem effs ([l], ())
forall a b. (a -> b) -> a -> b
$ Optic A_Traversal (WithIx is) TxSkel TxSkel x x
-> (is -> x -> Sem (Writer [l] : effs) x)
-> Sem (Writer [l] : effs) ()
forall (effs :: EffectRow) k is a.
(Member Tweak effs, Is k A_Traversal) =>
Optic' k (WithIx is) TxSkel a
-> (is -> a -> Sem effs a) -> Sem effs ()
itraverseTweak ((is -> Bool)
-> Optic A_Traversal (WithIx is) TxSkel TxSkel x x
-> Optic A_Traversal (WithIx is) TxSkel TxSkel x x
forall k (is :: IxList) i s t a.
(Is k A_Traversal, HasSingleIndex is i) =>
(i -> Bool) -> Optic k is s t a a -> IxTraversal i s t a a
indices (is -> Set is -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set is
grouping) Optic A_Traversal (WithIx is) TxSkel TxSkel x x
tOptic) ((is -> x -> Sem (Writer [l] : effs) x)
-> Sem (Writer [l] : effs) ())
-> (is -> x -> Sem (Writer [l] : effs) x)
-> Sem (Writer [l] : effs) ()
forall a b. (a -> b) -> a -> b
$ \is
index x
el -> do
(x
el', l
lbl) <- Sem effs (x, l) -> Sem (Writer [l] : effs) (x, l)
forall (e :: (* -> *) -> * -> *) (r :: EffectRow) a.
Sem r a -> Sem (e : r) a
raise (Sem effs (x, l) -> Sem (Writer [l] : effs) (x, l))
-> Sem effs (x, l) -> Sem (Writer [l] : effs) (x, l)
forall a b. (a -> b) -> a -> b
$ is -> x -> Sem effs (x, l)
changes is
index x
el
[l] -> Sem (Writer [l] : effs) ()
forall o (r :: EffectRow). Member (Writer o) r => o -> Sem r ()
tell [l
lbl]
x -> Sem (Writer [l] : effs) x
forall a. a -> Sem (Writer [l] : effs) a
forall (m :: * -> *) a. Monad m => a -> m a
return x
el'
data Branching
=
OneBranchForAllFoci
|
OneBranchPerFoci
|
OneBranchPerSubset
|
Manual (forall is. [is] -> [[is]])
data ModifyTweakParams k k' is is' f a b c where
ModifyTweakParams ::
{
forall k (is :: IxList) a k' (is' :: IxList) b c (f :: * -> *).
ModifyTweakParams k k' is is' f a b c -> Branching
branching :: Branching,
forall k (is :: IxList) a k' (is' :: IxList) b c (f :: * -> *).
ModifyTweakParams k k' is is' f a b c -> Optic' k is TxSkel a
outerOptic :: Optic' k is TxSkel a,
forall k (is :: IxList) a k' (is' :: IxList) b c (f :: * -> *).
ModifyTweakParams k k' is is' f a b c -> Optic k' is' a a b c
innerOptic :: Optic k' is' a a b c,
forall k (is :: IxList) a k' (is' :: IxList) b c (f :: * -> *).
ModifyTweakParams k k' is is' f a b c -> b -> f c
modification :: b -> f c,
forall k (is :: IxList) a k' (is' :: IxList) b c (f :: * -> *).
ModifyTweakParams k k' is is' f a b c -> Int -> Bool
selection :: Int -> Bool
} ->
ModifyTweakParams k k' is is' f a b c
modifyTweakParamsAllIndexes ::
Branching ->
Optic' k is TxSkel a ->
Optic k' is' a a b c ->
(b -> f c) ->
ModifyTweakParams k k' is is' f a b c
modifyTweakParamsAllIndexes :: forall k (is :: IxList) a k' (is' :: IxList) b c (f :: * -> *).
Branching
-> Optic' k is TxSkel a
-> Optic k' is' a a b c
-> (b -> f c)
-> ModifyTweakParams k k' is is' f a b c
modifyTweakParamsAllIndexes Branching
branching Optic' k is TxSkel a
opticOut Optic k' is' a a b c
opticIn b -> f c
mChange =
Branching
-> Optic' k is TxSkel a
-> Optic k' is' a a b c
-> (b -> f c)
-> (Int -> Bool)
-> ModifyTweakParams k k' is is' f a b c
forall k (is :: IxList) a k' (is' :: IxList) b c (f :: * -> *).
Branching
-> Optic' k is TxSkel a
-> Optic k' is' a a b c
-> (b -> f c)
-> (Int -> Bool)
-> ModifyTweakParams k k' is is' f a b c
ModifyTweakParams Branching
branching Optic' k is TxSkel a
opticOut Optic k' is' a a b c
opticIn b -> f c
mChange (Bool -> Int -> Bool
forall a b. a -> b -> a
const Bool
True)
modifyTweakParamsNoTypeChange ::
Branching ->
Optic' k is TxSkel a ->
(a -> f a) ->
ModifyTweakParams k An_Iso is NoIx f a a a
modifyTweakParamsNoTypeChange :: forall k (is :: IxList) a (f :: * -> *).
Branching
-> Optic' k is TxSkel a
-> (a -> f a)
-> ModifyTweakParams k An_Iso is '[] f a a a
modifyTweakParamsNoTypeChange Branching
branching Optic' k is TxSkel a
optic =
Branching
-> Optic' k is TxSkel a
-> Optic An_Iso '[] a a a a
-> (a -> f a)
-> ModifyTweakParams k An_Iso is '[] f a a a
forall k (is :: IxList) a k' (is' :: IxList) b c (f :: * -> *).
Branching
-> Optic' k is TxSkel a
-> Optic k' is' a a b c
-> (b -> f c)
-> ModifyTweakParams k k' is is' f a b c
modifyTweakParamsAllIndexes Branching
branching Optic' k is TxSkel a
optic Optic An_Iso '[] a a a a
forall a. Iso' a a
simple
modifyTweakParamsOneBranchForAllFoci ::
Optic' k is TxSkel a ->
(a -> f a) ->
ModifyTweakParams k An_Iso is NoIx f a a a
modifyTweakParamsOneBranchForAllFoci :: forall k (is :: IxList) a (f :: * -> *).
Optic' k is TxSkel a
-> (a -> f a) -> ModifyTweakParams k An_Iso is '[] f a a a
modifyTweakParamsOneBranchForAllFoci =
Branching
-> Optic' k is TxSkel a
-> (a -> f a)
-> ModifyTweakParams k An_Iso is '[] f a a a
forall k (is :: IxList) a (f :: * -> *).
Branching
-> Optic' k is TxSkel a
-> (a -> f a)
-> ModifyTweakParams k An_Iso is '[] f a a a
modifyTweakParamsNoTypeChange Branching
OneBranchForAllFoci
modifyTweakParamsOneBranchPerFoci ::
Optic' k is TxSkel a ->
(a -> f a) ->
ModifyTweakParams k An_Iso is NoIx f a a a
modifyTweakParamsOneBranchPerFoci :: forall k (is :: IxList) a (f :: * -> *).
Optic' k is TxSkel a
-> (a -> f a) -> ModifyTweakParams k An_Iso is '[] f a a a
modifyTweakParamsOneBranchPerFoci =
Branching
-> Optic' k is TxSkel a
-> (a -> f a)
-> ModifyTweakParams k An_Iso is '[] f a a a
forall k (is :: IxList) a (f :: * -> *).
Branching
-> Optic' k is TxSkel a
-> (a -> f a)
-> ModifyTweakParams k An_Iso is '[] f a a a
modifyTweakParamsNoTypeChange Branching
OneBranchPerFoci
modifyTweakParamsOneBranchPerSubset ::
Optic' k is TxSkel a ->
(a -> f a) ->
ModifyTweakParams k An_Iso is NoIx f a a a
modifyTweakParamsOneBranchPerSubset :: forall k (is :: IxList) a (f :: * -> *).
Optic' k is TxSkel a
-> (a -> f a) -> ModifyTweakParams k An_Iso is '[] f a a a
modifyTweakParamsOneBranchPerSubset =
Branching
-> Optic' k is TxSkel a
-> (a -> f a)
-> ModifyTweakParams k An_Iso is '[] f a a a
forall k (is :: IxList) a (f :: * -> *).
Branching
-> Optic' k is TxSkel a
-> (a -> f a)
-> ModifyTweakParams k An_Iso is '[] f a a a
modifyTweakParamsNoTypeChange Branching
OneBranchPerSubset
modifyTweakFromParams ::
( Members '[Tweak, NonDet] effs,
Is k A_Traversal,
Is k' An_AffineTraversal,
Foldable f,
Alternative f
) =>
ModifyTweakParams k k' is is' f a b c ->
Sem effs [b]
modifyTweakFromParams :: forall (effs :: EffectRow) k k' (f :: * -> *) (is :: IxList)
(is' :: IxList) a b c.
(Members '[Tweak, NonDet] effs, Is k A_Traversal,
Is k' An_AffineTraversal, Foldable f, Alternative f) =>
ModifyTweakParams k k' is is' f a b c -> Sem effs [b]
modifyTweakFromParams (ModifyTweakParams Branching
branching (forall destKind srcKind (is :: IxList) s t a b.
Is srcKind destKind =>
Optic srcKind is s t a b -> Optic destKind is s t a b
castOptic @A_Traversal -> Optic A_Traversal is TxSkel TxSkel a a
opticOut) (forall destKind srcKind (is :: IxList) s t a b.
Is srcKind destKind =>
Optic srcKind is s t a b -> Optic destKind is s t a b
castOptic @An_AffineTraversal -> Optic An_AffineTraversal is' a a b c
opticIn) b -> f c
change Int -> Bool
select) =
let
mChange :: a -> f a
mChange a
a = Bool -> f ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Either a b -> Bool
forall a b. Either a b -> Bool
isRight (Either a b -> Bool) -> Either a b -> Bool
forall a b. (a -> b) -> a -> b
$ Optic An_AffineTraversal is' a a b c -> a -> Either a b
forall k (is :: IxList) s t a b.
Is k An_AffineTraversal =>
Optic k is s t a b -> s -> Either t a
matching Optic An_AffineTraversal is' a a b c
opticIn a
a) f () -> f a -> f a
forall a b. f a -> f b -> f b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Optic An_AffineTraversal is' a a b c -> (b -> f c) -> a -> f a
forall k (f :: * -> *) (is :: IxList) s t a b.
(Is k A_Traversal, Applicative f) =>
Optic k is s t a b -> (a -> f b) -> s -> f t
traverseOf Optic An_AffineTraversal is' a a b c
opticIn b -> f c
change a
a
in ([Int] -> [[Int]])
-> Optic' A_Traversal (WithIx Int) TxSkel a
-> (Int -> a -> Sem effs (a, b))
-> Sem effs [b]
forall is k (effs :: EffectRow) x l.
(Ord is, Is k A_Traversal, Members '[Tweak, NonDet] effs) =>
([is] -> [[is]])
-> Optic' k (WithIx is) TxSkel x
-> (is -> x -> Sem effs (x, l))
-> Sem effs [l]
modifyTweak
( case Branching
branching of
Branching
OneBranchForAllFoci -> ([Int] -> [[Int]] -> [[Int]]
forall a. a -> [a] -> [a]
: [])
Branching
OneBranchPerFoci -> (Int -> [Int]) -> [Int] -> [[Int]]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
: [])
Branching
OneBranchPerSubset -> [[Int]] -> [[Int]]
forall a. HasCallStack => [a] -> [a]
tail ([[Int]] -> [[Int]]) -> ([Int] -> [[Int]]) -> [Int] -> [[Int]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Int] -> [[Int]]
forall a. [a] -> [[a]]
subsequences
Manual forall a. [a] -> [[a]]
f -> [Int] -> [[Int]]
forall a. [a] -> [[a]]
f
)
(Optic A_Traversal is TxSkel TxSkel a a
-> (Int -> Bool) -> Optic' A_Traversal (WithIx Int) TxSkel a
forall k (is :: IxList) s t a.
Is k A_Traversal =>
Optic k is s t a a -> (Int -> Bool) -> IxTraversal Int s t a a
elementsOf (Optic A_Traversal is TxSkel TxSkel a a
opticOut Optic A_Traversal is TxSkel TxSkel a a
-> Optic A_Prism '[] a a a a
-> Optic A_Traversal is TxSkel TxSkel a a
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% (a -> Bool) -> Optic A_Prism '[] a a a a
forall a. (a -> Bool) -> Prism' a a
selectP (Bool -> Bool
not (Bool -> Bool) -> (a -> Bool) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f a -> Bool
forall a. f a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (f a -> Bool) -> (a -> f a) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> f a
mChange)) Int -> Bool
select)
(\Int
_ a
a -> (,Either a b -> b
forall a b. Either a b -> b
fromRight' (Either a b -> b) -> Either a b -> b
forall a b. (a -> b) -> a -> b
$ Optic An_AffineTraversal is' a a b c -> a -> Either a b
forall k (is :: IxList) s t a b.
Is k An_AffineTraversal =>
Optic k is s t a b -> s -> Either t a
matching Optic An_AffineTraversal is' a a b c
opticIn a
a) (a -> (a, b)) -> Sem effs a -> Sem effs (a, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f (Sem effs a) -> Sem effs a
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum (a -> Sem effs a
forall a. a -> Sem effs a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Sem effs a) -> f a -> f (Sem effs a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f a
mChange a
a))