module Iri.Optics.Defs where

import qualified Data.Text.Encoding as Text
import Iri.Data
import Iri.Optics.Basics
import qualified Iri.Parsing.ByteString as B
import qualified Iri.Parsing.Text as D
import Iri.Prelude
import qualified Iri.Rendering.ByteString as A
import qualified Iri.Rendering.Text as C

-- * Definitions by source

-------------------------

-- ** Text

-------------------------

textIriIri :: Prism' Text Iri
textIriIri :: Prism' Text Iri
textIriIri =
  (Iri -> Text) -> (Text -> Either Text Iri) -> Prism' Text Iri
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism Iri -> Text
C.iri (\Text
text -> (Text -> Either Text Iri)
-> (Iri -> Either Text Iri) -> Either Text Iri -> Either Text Iri
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Either Text Iri -> Text -> Either Text Iri
forall a b. a -> b -> a
const (Text -> Either Text Iri
forall a b. a -> Either a b
Left Text
text)) Iri -> Either Text Iri
forall a b. b -> Either a b
Right (Text -> Either Text Iri
D.iri Text
text))

textIriHttpIri :: Prism' Text HttpIri
textIriHttpIri :: Prism' Text HttpIri
textIriHttpIri =
  p Iri (f Iri) -> p Text (f Text)
Prism' Text Iri
textIriIri (p Iri (f Iri) -> p Text (f Text))
-> (p HttpIri (f HttpIri) -> p Iri (f Iri))
-> p HttpIri (f HttpIri)
-> p Text (f Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. p HttpIri (f HttpIri) -> p Iri (f Iri)
Prism' Iri HttpIri
iriHttpIri

-- ** ByteString

-------------------------

byteStringIri :: Prism' ByteString Iri
byteStringIri :: Prism' ByteString Iri
byteStringIri =
  (Iri -> ByteString)
-> (ByteString -> Either ByteString Iri) -> Prism' ByteString Iri
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism Iri -> ByteString
A.uri (\ByteString
bytes -> (Text -> Either ByteString Iri)
-> (Iri -> Either ByteString Iri)
-> Either Text Iri
-> Either ByteString Iri
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Either ByteString Iri -> Text -> Either ByteString Iri
forall a b. a -> b -> a
const (ByteString -> Either ByteString Iri
forall a b. a -> Either a b
Left ByteString
bytes)) Iri -> Either ByteString Iri
forall a b. b -> Either a b
Right (ByteString -> Either Text Iri
B.uri ByteString
bytes))

byteStringHttpIri :: Prism' ByteString HttpIri
byteStringHttpIri :: Prism' ByteString HttpIri
byteStringHttpIri =
  p Iri (f Iri) -> p ByteString (f ByteString)
Prism' ByteString Iri
byteStringIri (p Iri (f Iri) -> p ByteString (f ByteString))
-> (p HttpIri (f HttpIri) -> p Iri (f Iri))
-> p HttpIri (f HttpIri)
-> p ByteString (f ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. p HttpIri (f HttpIri) -> p Iri (f Iri)
Prism' Iri HttpIri
iriHttpIri

byteStringTextInUtf8 :: Prism' ByteString Text
byteStringTextInUtf8 :: Prism' ByteString Text
byteStringTextInUtf8 = (Text -> ByteString)
-> (ByteString -> Maybe Text) -> Prism' ByteString Text
forall a s. (a -> s) -> (s -> Maybe a) -> Prism' s a
prism' Text -> ByteString
Text.encodeUtf8 ((UnicodeException -> Maybe Text)
-> (Text -> Maybe Text)
-> Either UnicodeException Text
-> Maybe Text
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Maybe Text -> UnicodeException -> Maybe Text
forall a b. a -> b -> a
const Maybe Text
forall a. Maybe a
Nothing) Text -> Maybe Text
forall a. a -> Maybe a
Just (Either UnicodeException Text -> Maybe Text)
-> (ByteString -> Either UnicodeException Text)
-> ByteString
-> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> Either UnicodeException Text
Text.decodeUtf8')

-- ** IRI

-------------------------

iriHttpIri :: Prism' Iri HttpIri
iriHttpIri :: Prism' Iri HttpIri
iriHttpIri = (HttpIri -> Iri) -> (Iri -> Maybe HttpIri) -> Prism' Iri HttpIri
forall a s. (a -> s) -> (s -> Maybe a) -> Prism' s a
prism' HttpIri -> Iri
iriFromHttpIri ((Text -> Maybe HttpIri)
-> (HttpIri -> Maybe HttpIri)
-> Either Text HttpIri
-> Maybe HttpIri
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Maybe HttpIri -> Text -> Maybe HttpIri
forall a b. a -> b -> a
const Maybe HttpIri
forall a. Maybe a
Nothing) HttpIri -> Maybe HttpIri
forall a. a -> Maybe a
Just (Either Text HttpIri -> Maybe HttpIri)
-> (Iri -> Either Text HttpIri) -> Iri -> Maybe HttpIri
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Iri -> Either Text HttpIri
httpIriFromIri)

iriScheme :: Lens' Iri Scheme
iriScheme :: Lens' Iri Scheme
iriScheme = (Iri -> Scheme) -> (Iri -> Scheme -> Iri) -> Lens' Iri Scheme
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\(Iri Scheme
x Hierarchy
_ Query
_ Fragment
_) -> Scheme
x) (\(Iri Scheme
_ Hierarchy
hierarchy Query
query Fragment
fragment) Scheme
x -> Scheme -> Hierarchy -> Query -> Fragment -> Iri
Iri Scheme
x Hierarchy
hierarchy Query
query Fragment
fragment)

iriHierarchy :: Lens' Iri Hierarchy
iriHierarchy :: Lens' Iri Hierarchy
iriHierarchy = (Iri -> Hierarchy)
-> (Iri -> Hierarchy -> Iri) -> Lens' Iri Hierarchy
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\(Iri Scheme
_ Hierarchy
x Query
_ Fragment
_) -> Hierarchy
x) (\(Iri Scheme
scheme Hierarchy
_ Query
query Fragment
fragment) Hierarchy
x -> Scheme -> Hierarchy -> Query -> Fragment -> Iri
Iri Scheme
scheme Hierarchy
x Query
query Fragment
fragment)

iriQuery :: Lens' Iri Query
iriQuery :: Lens' Iri Query
iriQuery = (Iri -> Query) -> (Iri -> Query -> Iri) -> Lens' Iri Query
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\(Iri Scheme
_ Hierarchy
_ Query
x Fragment
_) -> Query
x) (\(Iri Scheme
scheme Hierarchy
hierarchy Query
_ Fragment
fragment) Query
x -> Scheme -> Hierarchy -> Query -> Fragment -> Iri
Iri Scheme
scheme Hierarchy
hierarchy Query
x Fragment
fragment)

iriFragment :: Lens' Iri Fragment
iriFragment :: Lens' Iri Fragment
iriFragment = (Iri -> Fragment) -> (Iri -> Fragment -> Iri) -> Lens' Iri Fragment
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\(Iri Scheme
_ Hierarchy
_ Query
_ Fragment
x) -> Fragment
x) (\(Iri Scheme
scheme Hierarchy
hierarchy Query
query Fragment
_) Fragment
x -> Scheme -> Hierarchy -> Query -> Fragment -> Iri
Iri Scheme
scheme Hierarchy
hierarchy Query
query Fragment
x)

-- ** Scheme

-------------------------

schemeByteString :: Lens' Scheme ByteString
schemeByteString :: Lens' Scheme ByteString
schemeByteString = (Scheme -> ByteString)
-> (Scheme -> ByteString -> Scheme) -> Lens' Scheme ByteString
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\(Scheme ByteString
x) -> ByteString
x) ((ByteString -> Scheme) -> Scheme -> ByteString -> Scheme
forall a b. a -> b -> a
const ByteString -> Scheme
Scheme)

-- ** Fragment

-------------------------

fragmentByteString :: Lens' Fragment ByteString
fragmentByteString :: Lens' Fragment ByteString
fragmentByteString = (Fragment -> ByteString)
-> (Fragment -> ByteString -> Fragment)
-> Lens' Fragment ByteString
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\(Fragment ByteString
x) -> ByteString
x) ((ByteString -> Fragment) -> Fragment -> ByteString -> Fragment
forall a b. a -> b -> a
const ByteString -> Fragment
Fragment)