-- | This module exposes the notion of Anchor used in proposals and
-- certificates.
module Cooked.Skeleton.Anchor
  ( -- * Data types
    TxSkelAnchor,

    -- * Optics
    txSkelAnchorMResolvedPageAT,
    txSkelAnchorResolvedPageAT,
    txSkelAnchorURLAT,

    -- * Smart constructors
    simpleURLAnchor,
  )
where

import Data.ByteString
import Optics.Core

-- | A 'TxSkelAnchor' optionally bundles an URL as a String alongside an
-- optional resolved page as a ByteString.
type TxSkelAnchor =
  Maybe
    ( String, -- The anchor URL
      Maybe ByteString -- The optional anchor resolved page
    )

-- | Focusing on the URL of a 'TxSkelAnchor'
txSkelAnchorURLAT :: AffineTraversal' TxSkelAnchor String
txSkelAnchorURLAT :: AffineTraversal' TxSkelAnchor String
txSkelAnchorURLAT = Prism
  TxSkelAnchor
  TxSkelAnchor
  (String, Maybe ByteString)
  (String, Maybe ByteString)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just Prism
  TxSkelAnchor
  TxSkelAnchor
  (String, Maybe ByteString)
  (String, Maybe ByteString)
-> Optic
     A_Lens
     NoIx
     (String, Maybe ByteString)
     (String, Maybe ByteString)
     String
     String
-> AffineTraversal' TxSkelAnchor String
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
  (String, Maybe ByteString)
  (String, Maybe ByteString)
  String
  String
forall s t a b. Field1 s t a b => Lens s t a b
_1

-- | Focusing on the optional resolved page of a 'TxSkelAnchor'
txSkelAnchorMResolvedPageAT :: AffineTraversal' TxSkelAnchor (Maybe ByteString)
txSkelAnchorMResolvedPageAT :: AffineTraversal' TxSkelAnchor (Maybe ByteString)
txSkelAnchorMResolvedPageAT = Prism
  TxSkelAnchor
  TxSkelAnchor
  (String, Maybe ByteString)
  (String, Maybe ByteString)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just Prism
  TxSkelAnchor
  TxSkelAnchor
  (String, Maybe ByteString)
  (String, Maybe ByteString)
-> Optic
     A_Lens
     NoIx
     (String, Maybe ByteString)
     (String, Maybe ByteString)
     (Maybe ByteString)
     (Maybe ByteString)
-> AffineTraversal' TxSkelAnchor (Maybe ByteString)
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
  (String, Maybe ByteString)
  (String, Maybe ByteString)
  (Maybe ByteString)
  (Maybe ByteString)
forall s t a b. Field2 s t a b => Lens s t a b
_2

-- | Focusing on the existing resolved page of a 'TxSkelAnchor'
txSkelAnchorResolvedPageAT :: AffineTraversal' TxSkelAnchor ByteString
txSkelAnchorResolvedPageAT :: AffineTraversal' TxSkelAnchor ByteString
txSkelAnchorResolvedPageAT = AffineTraversal' TxSkelAnchor (Maybe ByteString)
txSkelAnchorMResolvedPageAT AffineTraversal' TxSkelAnchor (Maybe ByteString)
-> Optic
     A_Prism
     NoIx
     (Maybe ByteString)
     (Maybe ByteString)
     ByteString
     ByteString
-> AffineTraversal' TxSkelAnchor ByteString
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_Prism
  NoIx
  (Maybe ByteString)
  (Maybe ByteString)
  ByteString
  ByteString
forall a b. Prism (Maybe a) (Maybe b) a b
_Just

-- | Builds a simple Anchor with an URL
simpleURLAnchor :: String -> TxSkelAnchor
simpleURLAnchor :: String -> TxSkelAnchor
simpleURLAnchor = (String, Maybe ByteString) -> TxSkelAnchor
forall a. a -> Maybe a
Just ((String, Maybe ByteString) -> TxSkelAnchor)
-> (String -> (String, Maybe ByteString)) -> String -> TxSkelAnchor
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,Maybe ByteString
forall a. Maybe a
Nothing)