module ProAbstract.Metadata.HasMetadataOptics where

import ProAbstract.Metadata.HasMetadata
import ProAbstract.Metadata.MetaItem
import ProAbstract.Metadata.MetaValue

import qualified ProAbstract.Metadata.MetaList as Meta
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

metaMap :: (HasMetadata m, JoinKinds (MetadataOpticKind m) An_Iso k) => Optic' k NoIx m (Map Text MetaValue)
metaMap :: Optic' k NoIx m (Map Text MetaValue)
metaMap = 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
     An_Iso
     NoIx
     Metadata
     Metadata
     (Map Text MetaValue)
     (Map Text MetaValue)
-> Optic' k NoIx m (Map Text MetaValue)
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
  An_Iso
  NoIx
  Metadata
  Metadata
  (Map Text MetaValue)
  (Map Text MetaValue)
Meta.metaMap

metaList :: (HasMetadata m, Is (MetadataOpticKind m) An_AffineFold) => Getter m [MetaItem]
metaList :: Getter m [MetaItem]
metaList = (m -> [MetaItem]) -> Getter m [MetaItem]
forall s a. (s -> a) -> Getter s a
to ((m -> [MetaItem]) -> Getter m [MetaItem])
-> (m -> [MetaItem]) -> Getter m [MetaItem]
forall a b. (a -> b) -> a -> b
$ [MetaItem]
-> (Metadata -> [MetaItem]) -> Maybe Metadata -> [MetaItem]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (Optic' A_Getter NoIx Metadata [MetaItem] -> Metadata -> [MetaItem]
forall k (is :: IxList) s a.
Is k A_Getter =>
Optic' k is s a -> s -> a
view Optic' A_Getter NoIx Metadata [MetaItem]
Meta.metaList) (Maybe Metadata -> [MetaItem])
-> (m -> Maybe Metadata) -> m -> [MetaItem]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Optic' (MetadataOpticKind m) NoIx m Metadata -> m -> Maybe Metadata
forall k (is :: IxList) s a.
Is k An_AffineFold =>
Optic' k is s a -> s -> Maybe a
preview Optic' (MetadataOpticKind m) NoIx m Metadata
forall x.
HasMetadata x =>
Optic' (MetadataOpticKind x) NoIx x Metadata
metadata