{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}

-- | Lazy version of "Data.TypedEncoding.Conv.Text.Encoding"
-- @since 0.2.2.0
module Data.TypedEncoding.Conv.Text.Lazy.Encoding where

import qualified Data.ByteString.Lazy as BL
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TEL    

import           Data.TypedEncoding.Instances.Support
import qualified Data.TypedEncoding.Common.Util.TypeLits as Knds
import           Data.TypedEncoding.Instances.Restriction.UTF8 ()
import           Data.TypedEncoding.Instances.Restriction.ASCII ()
import           Data.TypedEncoding.Unsafe (withUnsafe)


-- | Lazy version of 'Data.TypedEncoding.Conv.Text.Encoding.decodeUtf8'
decodeUtf8 :: forall xs c t y ys encs. (
          Knds.UnSnoc xs ~ '(,) ys y
         , Superset "r-UTF8" y 
         , encs ~ RemoveRs ys
         , AllEncodeInto "r-UTF8" encs
        ) => Enc xs c BL.ByteString -> Enc xs c TL.Text 
decodeUtf8 :: Enc @[Symbol] xs c ByteString -> Enc @[Symbol] xs c Text
decodeUtf8 = (Unsafe @[Symbol] xs c ByteString -> Unsafe @[Symbol] xs c Text)
-> Enc @[Symbol] xs c ByteString -> Enc @[Symbol] xs c Text
forall k (e :: k) c s1 s2.
(Unsafe @k e c s1 -> Unsafe @k e c s2)
-> Enc @k e c s1 -> Enc @k e c s2
withUnsafe ((ByteString -> Text)
-> Unsafe @[Symbol] xs c ByteString -> Unsafe @[Symbol] xs c Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ByteString -> Text
TEL.decodeUtf8)

-- | simplified version of @decodeUtf8@ that works on single /r-/ encodings
-- @since 0.5.2.0
decodeUtf8_1 :: (
         Superset "r-UTF8" y 
         ) => Enc '[y] c  BL.ByteString -> Enc '[y] c TL.Text 
decodeUtf8_1 :: Enc @[Symbol] ((':) @Symbol y ('[] @Symbol)) c ByteString
-> Enc @[Symbol] ((':) @Symbol y ('[] @Symbol)) c Text
decodeUtf8_1 = Enc @[Symbol] ((':) @Symbol y ('[] @Symbol)) c ByteString
-> Enc @[Symbol] ((':) @Symbol y ('[] @Symbol)) c Text
forall (xs :: [Symbol]) c t (y :: Symbol) (ys :: [Symbol])
       (encs :: [Symbol]).
((UnSnoc @Symbol xs :: ([Symbol], Symbol))
 ~ ('(ys, y) :: ([Symbol], Symbol)),
 Superset "r-UTF8" y,
 (encs :: [Symbol]) ~ (RemoveRs ys :: [Symbol]),
 AllEncodeInto "r-UTF8" encs) =>
Enc @[Symbol] xs c ByteString -> Enc @[Symbol] xs c Text
decodeUtf8

-- | Lazy version of 'Data.TypedEncoding.Conv.Text.Encoding.encodeUtf8'
encodeUtf8 :: forall xs c t y ys encs. (
          Knds.UnSnoc xs ~ '(,) ys y
         , Superset "r-UTF8" y 
         , encs ~ RemoveRs ys
         , AllEncodeInto "r-UTF8" encs
        ) => Enc xs c TL.Text -> Enc xs c BL.ByteString 
encodeUtf8 :: Enc @[Symbol] xs c Text -> Enc @[Symbol] xs c ByteString
encodeUtf8 = (Unsafe @[Symbol] xs c Text -> Unsafe @[Symbol] xs c ByteString)
-> Enc @[Symbol] xs c Text -> Enc @[Symbol] xs c ByteString
forall k (e :: k) c s1 s2.
(Unsafe @k e c s1 -> Unsafe @k e c s2)
-> Enc @k e c s1 -> Enc @k e c s2
withUnsafe ((Text -> ByteString)
-> Unsafe @[Symbol] xs c Text -> Unsafe @[Symbol] xs c ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> ByteString
TEL.encodeUtf8)

-- | simplified version of @decodeUtf8@ that works on single /r-/ encodings
-- @since 0.5.2.0
encodeUtf8_1 :: (
         Superset "r-UTF8" y 
         ) => Enc '[y] c  TL.Text -> Enc '[y] c BL.ByteString 
encodeUtf8_1 :: Enc @[Symbol] ((':) @Symbol y ('[] @Symbol)) c Text
-> Enc @[Symbol] ((':) @Symbol y ('[] @Symbol)) c ByteString
encodeUtf8_1 = Enc @[Symbol] ((':) @Symbol y ('[] @Symbol)) c Text
-> Enc @[Symbol] ((':) @Symbol y ('[] @Symbol)) c ByteString
forall (xs :: [Symbol]) c t (y :: Symbol) (ys :: [Symbol])
       (encs :: [Symbol]).
((UnSnoc @Symbol xs :: ([Symbol], Symbol))
 ~ ('(ys, y) :: ([Symbol], Symbol)),
 Superset "r-UTF8" y,
 (encs :: [Symbol]) ~ (RemoveRs ys :: [Symbol]),
 AllEncodeInto "r-UTF8" encs) =>
Enc @[Symbol] xs c Text -> Enc @[Symbol] xs c ByteString
encodeUtf8