-- | This module provides tweaks that query the stored 'TxSkel' based on
-- various kinds of optics.
module Cooked.Tweak.Query
  ( -- * Querying via a getter
    viewTweak,
    iviewTweak,

    -- * Querying via a fold
    toListOfTweak,
    itoListOfTweak,

    -- * Querying via an affine fold
    previewTweak,
    ipreviewTweak,
  )
where

import Cooked.Skeleton
import Cooked.Tweak.Common
import Optics.Core
import Polysemy

-- | Retrieves the focus from the 'TxSkel' given a getter
viewTweak ::
  (Member Tweak effs, Is k A_Getter) =>
  Optic' k is TxSkel a ->
  Sem effs a
viewTweak :: forall (effs :: EffectRow) (k :: OpticKind) (is :: IxList)
       (a :: OpticKind).
(Member Tweak effs, Is k A_Getter) =>
Optic' k is TxSkel a -> Sem effs a
viewTweak Optic' k is TxSkel a
optic = Optic' k is TxSkel a -> TxSkel -> a
forall (k :: OpticKind) (is :: IxList) (s :: OpticKind)
       (a :: OpticKind).
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' k is TxSkel a
optic (TxSkel -> a) -> Sem effs TxSkel -> Sem effs a
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
       (b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Sem effs TxSkel
forall (r :: EffectRow). Member Tweak r => Sem r TxSkel
getTxSkel

-- | Like 'viewTweak', for indexed optics
iviewTweak ::
  (Member Tweak effs, Is k A_Getter) =>
  Optic' k (WithIx i) TxSkel a ->
  Sem effs (i, a)
iviewTweak :: forall (effs :: EffectRow) (k :: OpticKind) (i :: OpticKind)
       (a :: OpticKind).
(Member Tweak effs, Is k A_Getter) =>
Optic' k (WithIx i) TxSkel a -> Sem effs (i, a)
iviewTweak Optic' k (WithIx i) TxSkel a
optic = Optic' k (WithIx i) TxSkel a -> TxSkel -> (i, a)
forall (k :: OpticKind) (is :: IxList) (i :: OpticKind)
       (s :: OpticKind) (a :: OpticKind).
(Is k A_Getter, HasSingleIndex is i) =>
Optic' k is s a -> s -> (i, a)
iview Optic' k (WithIx i) TxSkel a
optic (TxSkel -> (i, a)) -> Sem effs TxSkel -> Sem effs (i, a)
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
       (b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Sem effs TxSkel
forall (r :: EffectRow). Member Tweak r => Sem r TxSkel
getTxSkel

-- | Like 'viewTweak', but returns all the foci as a list
toListOfTweak ::
  (Member Tweak effs, Is k A_Fold) =>
  Optic' k is TxSkel a ->
  Sem effs [a]
toListOfTweak :: forall (effs :: EffectRow) (k :: OpticKind) (is :: IxList)
       (a :: OpticKind).
(Member Tweak effs, Is k A_Fold) =>
Optic' k is TxSkel a -> Sem effs [a]
toListOfTweak Optic' k is TxSkel a
optic = Optic' k is TxSkel a -> TxSkel -> [a]
forall (k :: OpticKind) (is :: IxList) (s :: OpticKind)
       (a :: OpticKind).
Is k A_Fold =>
Optic' k is s a -> s -> [a]
toListOf Optic' k is TxSkel a
optic (TxSkel -> [a]) -> Sem effs TxSkel -> Sem effs [a]
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
       (b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Sem effs TxSkel
forall (r :: EffectRow). Member Tweak r => Sem r TxSkel
getTxSkel

-- | Like 'toListOfTweak', for indexed optics
itoListOfTweak ::
  (Member Tweak effs, Is k A_Fold) =>
  Optic' k (WithIx i) TxSkel a ->
  Sem effs [(i, a)]
itoListOfTweak :: forall (effs :: EffectRow) (k :: OpticKind) (i :: OpticKind)
       (a :: OpticKind).
(Member Tweak effs, Is k A_Fold) =>
Optic' k (WithIx i) TxSkel a -> Sem effs [(i, a)]
itoListOfTweak Optic' k (WithIx i) TxSkel a
optic = Optic' k (WithIx i) TxSkel a -> TxSkel -> [(i, a)]
forall (k :: OpticKind) (is :: IxList) (i :: OpticKind)
       (s :: OpticKind) (a :: OpticKind).
(Is k A_Fold, HasSingleIndex is i) =>
Optic' k is s a -> s -> [(i, a)]
itoListOf Optic' k (WithIx i) TxSkel a
optic (TxSkel -> [(i, a)]) -> Sem effs TxSkel -> Sem effs [(i, a)]
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
       (b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Sem effs TxSkel
forall (r :: EffectRow). Member Tweak r => Sem r TxSkel
getTxSkel

-- | Like 'viewTweak', but the foci might not exist
previewTweak ::
  (Member Tweak effs, Is k An_AffineFold) =>
  Optic' k is TxSkel a ->
  Sem effs (Maybe a)
previewTweak :: forall (effs :: EffectRow) (k :: OpticKind) (is :: IxList)
       (a :: OpticKind).
(Member Tweak effs, Is k An_AffineFold) =>
Optic' k is TxSkel a -> Sem effs (Maybe a)
previewTweak Optic' k is TxSkel a
optic = Optic' k is TxSkel a -> TxSkel -> Maybe a
forall (k :: OpticKind) (is :: IxList) (s :: OpticKind)
       (a :: OpticKind).
Is k An_AffineFold =>
Optic' k is s a -> s -> Maybe a
preview Optic' k is TxSkel a
optic (TxSkel -> Maybe a) -> Sem effs TxSkel -> Sem effs (Maybe a)
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
       (b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Sem effs TxSkel
forall (r :: EffectRow). Member Tweak r => Sem r TxSkel
getTxSkel

-- | Like 'previewTweak', for indexed optics
ipreviewTweak ::
  (Member Tweak effs, Is k An_AffineFold) =>
  Optic' k (WithIx i) TxSkel a ->
  Sem effs (Maybe (i, a))
ipreviewTweak :: forall (effs :: EffectRow) (k :: OpticKind) (i :: OpticKind)
       (a :: OpticKind).
(Member Tweak effs, Is k An_AffineFold) =>
Optic' k (WithIx i) TxSkel a -> Sem effs (Maybe (i, a))
ipreviewTweak Optic' k (WithIx i) TxSkel a
optic = Optic' k (WithIx i) TxSkel a -> TxSkel -> Maybe (i, a)
forall (k :: OpticKind) (is :: IxList) (i :: OpticKind)
       (s :: OpticKind) (a :: OpticKind).
(Is k An_AffineFold, HasSingleIndex is i) =>
Optic' k is s a -> s -> Maybe (i, a)
ipreview Optic' k (WithIx i) TxSkel a
optic (TxSkel -> Maybe (i, a))
-> Sem effs TxSkel -> Sem effs (Maybe (i, a))
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
       (b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Sem effs TxSkel
forall (r :: EffectRow). Member Tweak r => Sem r TxSkel
getTxSkel