module ProAbstract.Metadata.HasMetadataOptics
    ( properties, settings, hasProperty, atSetting
    ) where

import ProAbstract.Metadata.HasMetadata

import qualified ProAbstract.Metadata.MetadataOptics as Meta

-- | Fetch all properties from items which contain metadata.
properties :: (HasMetadata m, JoinKinds (MetadataOpticKind m) A_Lens k) => Optic' k NoIx m (Set Text)
properties :: Optic' k NoIx m (Set Text)
properties = Optic (MetadataOpticKind m) NoIx m m Metadata Metadata
forall x.
HasMetadata x =>
Optic' (MetadataOpticKind x) NoIx x Metadata
metadata Optic (MetadataOpticKind m) NoIx m m Metadata Metadata
-> Optic A_Lens NoIx Metadata Metadata (Set Text) (Set Text)
-> Optic' k NoIx m (Set Text)
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
% Optic A_Lens NoIx Metadata Metadata (Set Text) (Set Text)
Meta.properties

-- | Fetch all settings defined on items which contain metadata.
settings :: (HasMetadata m, JoinKinds (MetadataOpticKind m) A_Lens k) => Optic' k NoIx m (Map Text Text)
settings :: Optic' k NoIx m (Map Text Text)
settings = Optic (MetadataOpticKind m) NoIx m m Metadata Metadata
forall x.
HasMetadata x =>
Optic' (MetadataOpticKind x) NoIx x Metadata
metadata Optic (MetadataOpticKind m) NoIx m m Metadata Metadata
-> Optic
     A_Lens NoIx Metadata Metadata (Map Text Text) (Map Text Text)
-> Optic' k NoIx m (Map Text Text)
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
% Optic A_Lens NoIx Metadata Metadata (Map Text Text) (Map Text Text)
Meta.settings

-- | Check if a property is attached to an item with metadata. Using this optic as a setter will add a property if set to 'True' and remove the property when set to 'False'.
hasProperty :: (HasMetadata m, JoinKinds (MetadataOpticKind m) A_Lens k) => Text -> Optic' k NoIx m Bool
hasProperty :: Text -> Optic' k NoIx m Bool
hasProperty Text
k = Optic (MetadataOpticKind m) NoIx m m Metadata Metadata
forall x.
HasMetadata x =>
Optic' (MetadataOpticKind x) NoIx x Metadata
metadata Optic (MetadataOpticKind m) NoIx m m Metadata Metadata
-> Optic A_Lens NoIx Metadata Metadata Bool Bool
-> Optic' k NoIx m Bool
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
% Text -> Optic A_Lens NoIx Metadata Metadata Bool Bool
Meta.hasProperty Text
k

-- | Select a setting from an item attached to metadata. Returns 'Nothing' if no value is set.
atSetting :: (HasMetadata m, JoinKinds (MetadataOpticKind m) A_Lens k) => Text -> Optic' k NoIx m (Maybe Text)
atSetting :: Text -> Optic' k NoIx m (Maybe Text)
atSetting Text
k = Optic (MetadataOpticKind m) NoIx m m Metadata Metadata
forall x.
HasMetadata x =>
Optic' (MetadataOpticKind x) NoIx x Metadata
metadata Optic (MetadataOpticKind m) NoIx m m Metadata Metadata
-> Optic A_Lens NoIx Metadata Metadata (Maybe Text) (Maybe Text)
-> Optic' k NoIx m (Maybe Text)
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
% Text
-> Optic A_Lens NoIx Metadata Metadata (Maybe Text) (Maybe Text)
Meta.atSetting Text
k