module Text.XML.Basic.ProcessingInstruction (
   T(..),
   mapName,
   mapAttributes, mapAttributesA,
   ) where

import qualified Text.XML.Basic.Attribute as Attr
import qualified Text.XML.Basic.Name as Name
import qualified Text.XML.Basic.Format as Fmt

import Data.Monoid (mempty, )

import Data.Foldable (Foldable(foldMap), )
import Data.Traversable (Traversable(sequenceA), traverse, )
import Control.Applicative (Applicative, pure, liftA, )


data T name string =
     Known [Attr.T name string]
   | Unknown String
     deriving (T name string -> T name string -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall name string.
(Eq name, Eq string) =>
T name string -> T name string -> Bool
/= :: T name string -> T name string -> Bool
$c/= :: forall name string.
(Eq name, Eq string) =>
T name string -> T name string -> Bool
== :: T name string -> T name string -> Bool
$c== :: forall name string.
(Eq name, Eq string) =>
T name string -> T name string -> Bool
Eq, T name string -> T name string -> Bool
T name string -> T name string -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {name} {string}.
(Ord name, Ord string) =>
Eq (T name string)
forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> Bool
forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> Ordering
forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> T name string
min :: T name string -> T name string -> T name string
$cmin :: forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> T name string
max :: T name string -> T name string -> T name string
$cmax :: forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> T name string
>= :: T name string -> T name string -> Bool
$c>= :: forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> Bool
> :: T name string -> T name string -> Bool
$c> :: forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> Bool
<= :: T name string -> T name string -> Bool
$c<= :: forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> Bool
< :: T name string -> T name string -> Bool
$c< :: forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> Bool
compare :: T name string -> T name string -> Ordering
$ccompare :: forall name string.
(Ord name, Ord string) =>
T name string -> T name string -> Ordering
Ord {- , Show -} )


{-
JHC cannot generate this instance automatically,
since it fails to generate the (Name.Attribute name) constraint.
-}
instance (Name.Attribute name, Show string) => Show (T name string) where
   showsPrec :: Int -> T name string -> ShowS
showsPrec Int
p T name string
x =
      Bool -> ShowS -> ShowS
showParen (Int
pforall a. Ord a => a -> a -> Bool
>Int
10) forall a b. (a -> b) -> a -> b
$
      case T name string
x of
         Known [T name string]
attrs -> String -> ShowS
showString String
"Known " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 [T name string]
attrs
         Unknown String
str -> String -> ShowS
showString String
"Unknown " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> ShowS
shows String
str


instance (Name.Attribute name, Fmt.C string) => Fmt.C (T name string) where
   run :: T name string -> ShowS
run T name string
p =
      case T name string
p of
         Known [T name string]
attrs -> forall name string.
(Attribute name, C string) =>
[T name string] -> ShowS
Attr.formatListBlankHead [T name string]
attrs
         Unknown String
str -> ShowS
Fmt.blank forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
str


instance Functor (T name) where
   fmap :: forall a b. (a -> b) -> T name a -> T name b
fmap a -> b
f T name a
proc =
      case T name a
proc of
         Known [T name a]
attrs  -> forall name string. [T name string] -> T name string
Known forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) [T name a]
attrs
         Unknown String
text -> forall name string. String -> T name string
Unknown String
text

instance Foldable (T name) where
   foldMap :: forall m a. Monoid m => (a -> m) -> T name a -> m
foldMap a -> m
f T name a
proc =
      case T name a
proc of
         Known [T name a]
attrs   -> forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap a -> m
f) [T name a]
attrs
         Unknown String
_text -> forall a. Monoid a => a
mempty

instance Traversable (T name) where
   sequenceA :: forall (f :: * -> *) a.
Applicative f =>
T name (f a) -> f (T name a)
sequenceA T name (f a)
proc =
      case T name (f a)
proc of
         Known [T name (f a)]
attrs  -> forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA forall name string. [T name string] -> T name string
Known forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA [T name (f a)]
attrs
         Unknown String
text -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall name string. String -> T name string
Unknown String
text

mapName ::
   (Attr.Name name0 -> Attr.Name name1) ->
   T name0 string -> T name1 string
mapName :: forall name0 name1 string.
(Name name0 -> Name name1) -> T name0 string -> T name1 string
mapName Name name0 -> Name name1
f =
   forall name0 string0 name1 string1.
([T name0 string0] -> [T name1 string1])
-> T name0 string0 -> T name1 string1
mapAttributes (forall a b. (a -> b) -> [a] -> [b]
map (forall name0 name1 string.
(Name name0 -> Name name1) -> T name0 string -> T name1 string
Attr.mapName Name name0 -> Name name1
f))


mapAttributes ::
   ([Attr.T name0 string0] -> [Attr.T name1 string1]) ->
   T name0 string0 -> T name1 string1
mapAttributes :: forall name0 string0 name1 string1.
([T name0 string0] -> [T name1 string1])
-> T name0 string0 -> T name1 string1
mapAttributes [T name0 string0] -> [T name1 string1]
f T name0 string0
proc =
   case T name0 string0
proc of
      Known [T name0 string0]
attrs  -> forall name string. [T name string] -> T name string
Known forall a b. (a -> b) -> a -> b
$ [T name0 string0] -> [T name1 string1]
f [T name0 string0]
attrs
      Unknown String
text -> forall name string. String -> T name string
Unknown String
text

mapAttributesA ::
   (Applicative f) =>
   ([Attr.T name0 string0] -> f [Attr.T name1 string1]) ->
   T name0 string0 -> f (T name1 string1)
mapAttributesA :: forall (f :: * -> *) name0 string0 name1 string1.
Applicative f =>
([T name0 string0] -> f [T name1 string1])
-> T name0 string0 -> f (T name1 string1)
mapAttributesA [T name0 string0] -> f [T name1 string1]
f T name0 string0
proc =
   case T name0 string0
proc of
      Known [T name0 string0]
attrs  -> forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA forall name string. [T name string] -> T name string
Known forall a b. (a -> b) -> a -> b
$ [T name0 string0] -> f [T name1 string1]
f [T name0 string0]
attrs
      Unknown String
text -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall name string. String -> T name string
Unknown String
text