{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE FlexibleInstances #-}

module Data.Stringz.String where

import Control.Lens
import qualified Data.ByteString.Char8 as ByteStringChar8
import qualified Data.ByteString.Lazy.Char8 as ByteStringLazyChar8
import qualified Data.Text as Text
import qualified Data.Text.Lazy as LazyText

class HasString a where
  string ::
    Lens' a String

instance HasString [Char] where
  string :: Lens' [Char] [Char]
string =
    ([Char] -> f [Char]) -> [Char] -> f [Char]
forall a. a -> a
id
instance HasString Text.Text where
  string :: Lens' Text [Char]
string =
    (Text -> [Char]) -> ([Char] -> Text) -> Iso Text Text [Char] [Char]
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
      Text -> [Char]
Text.unpack
      [Char] -> Text
Text.pack

instance HasString LazyText.Text where
  string :: Lens' Text [Char]
string =
    (Text -> [Char]) -> ([Char] -> Text) -> Iso Text Text [Char] [Char]
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
      Text -> [Char]
LazyText.unpack
      [Char] -> Text
LazyText.pack

instance HasString ByteStringChar8.ByteString where
  string :: Lens' ByteString [Char]
string =
    (ByteString -> [Char])
-> ([Char] -> ByteString)
-> Iso ByteString ByteString [Char] [Char]
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso ByteString -> [Char]
ByteStringChar8.unpack [Char] -> ByteString
ByteStringChar8.pack (([Char] -> f [Char]) -> ByteString -> f ByteString)
-> (([Char] -> f [Char]) -> [Char] -> f [Char])
-> ([Char] -> f [Char])
-> ByteString
-> f ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> f [Char]) -> [Char] -> f [Char]
forall a. HasString a => Lens' a [Char]
Lens' [Char] [Char]
string

instance HasString ByteStringLazyChar8.ByteString where
  string :: Lens' ByteString [Char]
string =
    (ByteString -> [Char])
-> ([Char] -> ByteString)
-> Iso ByteString ByteString [Char] [Char]
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso ByteString -> [Char]
ByteStringLazyChar8.unpack [Char] -> ByteString
ByteStringLazyChar8.pack (([Char] -> f [Char]) -> ByteString -> f ByteString)
-> (([Char] -> f [Char]) -> [Char] -> f [Char])
-> ([Char] -> f [Char])
-> ByteString
-> f ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> f [Char]) -> [Char] -> f [Char]
forall a. HasString a => Lens' a [Char]
Lens' [Char] [Char]
string

instance HasString a => HasString (Identity a) where
  string :: Lens' (Identity a) [Char]
string =
    (Identity a -> a)
-> (a -> Identity a) -> Iso (Identity a) (Identity a) a a
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso Identity a -> a
forall a. Identity a -> a
runIdentity a -> Identity a
forall a. a -> Identity a
Identity ((a -> f a) -> Identity a -> f (Identity a))
-> (([Char] -> f [Char]) -> a -> f a)
-> ([Char] -> f [Char])
-> Identity a
-> f (Identity a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> f [Char]) -> a -> f a
forall a. HasString a => Lens' a [Char]
Lens' a [Char]
string

instance HasString a => HasString (Const a b) where
  string :: Lens' (Const a b) [Char]
string =
    (Const a b -> a)
-> (a -> Const a b) -> Iso (Const a b) (Const a b) a a
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso Const a b -> a
forall {k} a (b :: k). Const a b -> a
getConst a -> Const a b
forall {k} a (b :: k). a -> Const a b
Const ((a -> f a) -> Const a b -> f (Const a b))
-> (([Char] -> f [Char]) -> a -> f a)
-> ([Char] -> f [Char])
-> Const a b
-> f (Const a b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> f [Char]) -> a -> f a
forall a. HasString a => Lens' a [Char]
Lens' a [Char]
string

class AsString a where
  _String ::
    Prism' a String

instance AsString [Char] where
  _String :: Prism' [Char] [Char]
_String =
    p [Char] (f [Char]) -> p [Char] (f [Char])
forall a. a -> a
id

instance AsString Text.Text where
  _String :: Prism' Text [Char]
_String =
    (Text -> [Char]) -> ([Char] -> Text) -> Iso Text Text [Char] [Char]
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
      Text -> [Char]
Text.unpack
      [Char] -> Text
Text.pack

instance AsString LazyText.Text where
  _String :: Prism' Text [Char]
_String =
    (Text -> [Char]) -> ([Char] -> Text) -> Iso Text Text [Char] [Char]
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
      Text -> [Char]
LazyText.unpack
      [Char] -> Text
LazyText.pack

instance AsString ByteStringChar8.ByteString where
  _String :: Prism' ByteString [Char]
_String =
    (ByteString -> [Char])
-> ([Char] -> ByteString)
-> Iso ByteString ByteString [Char] [Char]
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso ByteString -> [Char]
ByteStringChar8.unpack [Char] -> ByteString
ByteStringChar8.pack (p [Char] (f [Char]) -> p ByteString (f ByteString))
-> (p [Char] (f [Char]) -> p [Char] (f [Char]))
-> p [Char] (f [Char])
-> p ByteString (f ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p [Char] (f [Char]) -> p [Char] (f [Char])
forall a. AsString a => Prism' a [Char]
Prism' [Char] [Char]
_String

instance AsString ByteStringLazyChar8.ByteString where
  _String :: Prism' ByteString [Char]
_String =
    (ByteString -> [Char])
-> ([Char] -> ByteString)
-> Iso ByteString ByteString [Char] [Char]
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso ByteString -> [Char]
ByteStringLazyChar8.unpack [Char] -> ByteString
ByteStringLazyChar8.pack (p [Char] (f [Char]) -> p ByteString (f ByteString))
-> (p [Char] (f [Char]) -> p [Char] (f [Char]))
-> p [Char] (f [Char])
-> p ByteString (f ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p [Char] (f [Char]) -> p [Char] (f [Char])
forall a. AsString a => Prism' a [Char]
Prism' [Char] [Char]
_String

instance AsString a => AsString (Identity a) where
  _String :: Prism' (Identity a) [Char]
_String =
    (Identity a -> a)
-> (a -> Identity a) -> Iso (Identity a) (Identity a) a a
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso Identity a -> a
forall a. Identity a -> a
runIdentity a -> Identity a
forall a. a -> Identity a
Identity (p a (f a) -> p (Identity a) (f (Identity a)))
-> (p [Char] (f [Char]) -> p a (f a))
-> p [Char] (f [Char])
-> p (Identity a) (f (Identity a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p [Char] (f [Char]) -> p a (f a)
forall a. AsString a => Prism' a [Char]
Prism' a [Char]
_String

instance AsString a => AsString (Const a b) where
  _String :: Prism' (Const a b) [Char]
_String =
    (Const a b -> a)
-> (a -> Const a b) -> Iso (Const a b) (Const a b) a a
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso Const a b -> a
forall {k} a (b :: k). Const a b -> a
getConst a -> Const a b
forall {k} a (b :: k). a -> Const a b
Const (p a (f a) -> p (Const a b) (f (Const a b)))
-> (p [Char] (f [Char]) -> p a (f a))
-> p [Char] (f [Char])
-> p (Const a b) (f (Const a b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p [Char] (f [Char]) -> p a (f a)
forall a. AsString a => Prism' a [Char]
Prism' a [Char]
_String