{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}

-- | 
-- v0.2 like (backward compatible) combinators for covering to and from encoded string.
--
-- @since 0.3.0.0

module Data.TypedEncoding.Combinators.ToEncStr where

import           Data.TypedEncoding.Common.Class
import           Data.TypedEncoding.Common.Types (Enc(..) )

import           Data.Functor.Identity

-- * backward compatible v0.2 like combinators

toEncStringF :: forall nm f a str  . (ToEncString f nm nm a str) => a -> f (Enc '[nm] () str)
toEncStringF :: a -> f (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
toEncStringF = forall (alg :: Symbol) (nm :: Symbol) (f :: * -> *) a str.
ToEncString f nm alg a str =>
a -> f (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
forall (f :: * -> *) a str.
ToEncString f nm nm a str =>
a -> f (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
toEncStringF' @nm @nm

toEncStringF' :: forall alg nm f a str  . (ToEncString f nm alg a str) => a -> f (Enc '[nm] () str)
toEncStringF' :: a -> f (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
toEncStringF' = forall a str.
ToEncString f nm alg a str =>
a -> f (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
forall (f :: * -> *) (nm :: Symbol) (ann :: Symbol) a str.
ToEncString f nm ann a str =>
a -> f (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
toEncF @f @nm @alg

toEncString :: forall nm a str  . (ToEncString Identity nm nm a str) => a -> Enc '[nm] () str
toEncString :: a -> Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str
toEncString = forall a str.
ToEncString Identity nm nm a str =>
a -> Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str
forall (alg :: Symbol) (nm :: Symbol) a str.
ToEncString Identity nm alg a str =>
a -> Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str
toEncString' @nm @nm

toEncString' :: forall alg nm a str  . (ToEncString Identity nm alg a str) => a -> Enc '[nm] () str
toEncString' :: a -> Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str
toEncString' = Identity (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
-> Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str
forall a. Identity a -> a
runIdentity (Identity (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
 -> Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
-> (a
    -> Identity (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str))
-> a
-> Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a str.
ToEncString Identity nm alg a str =>
a
-> Identity (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
forall (f :: * -> *) (nm :: Symbol) (ann :: Symbol) a str.
ToEncString f nm ann a str =>
a -> f (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str)
toEncF @Identity @nm @alg



fromEncStringF :: forall nm f a str  . (FromEncString f nm nm a str) => Enc '[nm] () str -> f a
fromEncStringF :: Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> f a
fromEncStringF = forall k (alg :: Symbol) (nm :: Symbol) (f :: k -> *) (a :: k) str.
FromEncString @k f nm alg a str =>
Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> f a
forall (f :: k -> *) (a :: k) str.
FromEncString @k f nm nm a str =>
Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> f a
fromEncStringF' @nm @nm

fromEncStringF' :: forall alg nm f a str  . (FromEncString f nm alg a str) => Enc '[nm] () str -> f a
fromEncStringF' :: Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> f a
fromEncStringF' = forall (a :: k) str.
FromEncString @k f nm alg a str =>
Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> f a
forall k (f :: k -> *) (nm :: Symbol) (ann :: Symbol) (a :: k) str.
FromEncString @k f nm ann a str =>
Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> f a
fromEncF @f @nm @alg

fromEncString :: forall nm a str  . (FromEncString Identity nm nm a str) => Enc '[nm] () str -> a
fromEncString :: Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> a
fromEncString = forall a str.
FromEncString @* Identity nm nm a str =>
Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> a
forall (alg :: Symbol) (nm :: Symbol) a str.
FromEncString @* Identity nm alg a str =>
Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> a
fromEncString' @nm @nm

fromEncString' :: forall alg nm a str  . (FromEncString Identity nm alg a str) => Enc '[nm] () str -> a
fromEncString' :: Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> a
fromEncString' = Identity a -> a
forall a. Identity a -> a
runIdentity (Identity a -> a)
-> (Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str
    -> Identity a)
-> Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a str.
FromEncString @* Identity nm alg a str =>
Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> Identity a
forall k (f :: k -> *) (nm :: Symbol) (ann :: Symbol) (a :: k) str.
FromEncString @k f nm ann a str =>
Enc @[Symbol] ((':) @Symbol nm ('[] @Symbol)) () str -> f a
fromEncF @Identity @nm @alg