{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
-- {-# LANGUAGE AllowAmbiguousTypes #-}
-- {-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}

-- | Direct use of these methods is discouraged.
-- Use "Data.TypedEncoding.Instances.Support.Encode" or "Data.TypedEncoding.Instances.Support.Decode" 
-- instead.
module Data.TypedEncoding.Instances.Support.Unsafe where

import           Data.Proxy
import           Data.TypedEncoding.Common.Types
import           Data.TypedEncoding.Combinators.Unsafe


-- |
-- @since 0.1.0.0
implTranF :: Functor f => (str -> f str) -> Enc enc1 conf str -> f (Enc enc2 conf str)
implTranF :: (str -> f str) -> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
implTranF str -> f str
f  = (conf -> str -> f str)
-> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
forall k k (f :: * -> *) conf str (enc1 :: k) (enc2 :: k).
Functor f =>
(conf -> str -> f str)
-> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
implTranF' ((str -> f str) -> conf -> str -> f str
forall a b. a -> b -> a
const str -> f str
f)

-- |
-- @since 0.1.0.0
implTranF' :: Functor f =>  (conf -> str -> f str) -> Enc enc1 conf str -> f (Enc enc2 conf str)
implTranF' :: (conf -> str -> f str)
-> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
implTranF' conf -> str -> f str
f (UnsafeMkEnc Proxy @k enc1
_ conf
conf str
str) = Proxy @k enc2 -> conf -> str -> Enc @k enc2 conf str
forall k (nms :: k) conf str.
Proxy @k nms -> conf -> str -> Enc @k nms conf str
UnsafeMkEnc Proxy @k enc2
forall k (t :: k). Proxy @k t
Proxy conf
conf (str -> Enc @k enc2 conf str) -> f str -> f (Enc @k enc2 conf str)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> conf -> str -> f str
f conf
conf str
str

-- |
-- @since 0.1.0.0
implTranP :: Applicative f => (str -> str) -> Enc enc1 conf str -> f (Enc enc2 conf str)
implTranP :: (str -> str) -> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
implTranP str -> str
f  = (conf -> str -> f str)
-> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
forall k k (f :: * -> *) conf str (enc1 :: k) (enc2 :: k).
Functor f =>
(conf -> str -> f str)
-> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
implTranF' (\conf
c -> str -> f str
forall (f :: * -> *) a. Applicative f => a -> f a
pure (str -> f str) -> (str -> str) -> str -> f str
forall b c a. (b -> c) -> (a -> b) -> a -> c
. str -> str
f)

-- |
-- @since 0.1.0.0
implTranP' :: Applicative f => (conf -> str -> str) -> Enc enc1 conf str -> f (Enc enc2 conf str)
implTranP' :: (conf -> str -> str)
-> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
implTranP' conf -> str -> str
f  = (conf -> str -> f str)
-> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
forall k k (f :: * -> *) conf str (enc1 :: k) (enc2 :: k).
Functor f =>
(conf -> str -> f str)
-> Enc @k enc1 conf str -> f (Enc @k enc2 conf str)
implTranF' (\conf
c -> str -> f str
forall (f :: * -> *) a. Applicative f => a -> f a
pure (str -> f str) -> (str -> str) -> str -> f str
forall b c a. (b -> c) -> (a -> b) -> a -> c
. conf -> str -> str
f conf
c)

-- |
-- @since 0.2.1.0
implChangeAnn :: Functor f => (Enc enc1 conf str -> f (Enc enc2a conf str)) -> Enc enc1 conf str -> f (Enc enc2b conf str)
implChangeAnn :: (Enc @k enc1 conf str -> f (Enc @k enc2a conf str))
-> Enc @k enc1 conf str -> f (Enc @k enc2b conf str)
implChangeAnn Enc @k enc1 conf str -> f (Enc @k enc2a conf str)
fn = (Enc @k enc2a conf str -> Enc @k enc2b conf str)
-> f (Enc @k enc2a conf str) -> f (Enc @k enc2b conf str)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((str -> str) -> Enc @k enc2a conf str -> Enc @k enc2b conf str
forall k1 k2 s1 s2 (e1 :: k1) c (e2 :: k2).
(s1 -> s2) -> Enc @k1 e1 c s1 -> Enc @k2 e2 c s2
withUnsafeCoerce str -> str
forall a. a -> a
id) (f (Enc @k enc2a conf str) -> f (Enc @k enc2b conf str))
-> (Enc @k enc1 conf str -> f (Enc @k enc2a conf str))
-> Enc @k enc1 conf str
-> f (Enc @k enc2b conf str)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Enc @k enc1 conf str -> f (Enc @k enc2a conf str)
fn