{- -----------------------------------------------------------------------------
Copyright 2020 Kevin P. Barry

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
----------------------------------------------------------------------------- -}

-- Author: Kevin P. Barry [ta0kira@gmail.com]

module Test.MergeTree (tests) where

import Control.Monad (when)
import Data.Char (toUpper)

import Base.CompilerError
import Base.TrackedErrors
import Base.MergeTree
import Base.Mergeable


tests :: [IO (TrackedErrors ())]
tests :: [IO (TrackedErrors ())]
tests = [
   MergeTree Int
-> (MergeTree Int -> MergeTree Int)
-> MergeTree Int
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAny ([MergeTree Int] -> MergeTree Int)
-> [MergeTree Int] -> MergeTree Int
forall a b. (a -> b) -> a -> b
$ (Int -> MergeTree Int) -> [Int] -> [MergeTree Int]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf [Int
2,Int
4,Int
6]) ((Int -> Int) -> MergeTree Int -> MergeTree Int
forall a b. (a -> b) -> MergeTree a -> MergeTree b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
2))
              ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAny ([MergeTree Int] -> MergeTree Int)
-> [MergeTree Int] -> MergeTree Int
forall a b. (a -> b) -> a -> b
$ (Int -> MergeTree Int) -> [Int] -> [MergeTree Int]
forall a b. (a -> b) -> [a] -> [b]
map Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf [Int
1..Int
3] :: MergeTree Int),
   MergeTree Int
-> (MergeTree Int -> MergeTree Int)
-> MergeTree Int
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAll ([MergeTree Int] -> MergeTree Int)
-> [MergeTree Int] -> MergeTree Int
forall a b. (a -> b) -> a -> b
$ (Int -> MergeTree Int) -> [Int] -> [MergeTree Int]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf [Int
2,Int
4,Int
6]) ((Int -> Int) -> MergeTree Int -> MergeTree Int
forall a b. (a -> b) -> MergeTree a -> MergeTree b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
2))
              ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAll ([MergeTree Int] -> MergeTree Int)
-> [MergeTree Int] -> MergeTree Int
forall a b. (a -> b) -> a -> b
$ (Int -> MergeTree Int) -> [Int] -> [MergeTree Int]
forall a b. (a -> b) -> [a] -> [b]
map Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf [Int
1..Int
3] :: MergeTree Int),

   MergeTree Int
-> (MergeTree Int -> MergeTree Int)
-> MergeTree Int
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch (Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1) MergeTree Int -> MergeTree Int
forall a. a -> a
id ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAny [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1,MergeTree Int
forall a. Bounded a => a
minBound] :: MergeTree Int),
   MergeTree Int
-> (MergeTree Int -> MergeTree Int)
-> MergeTree Int
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch (Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1) MergeTree Int -> MergeTree Int
forall a. a -> a
id ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAll [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1,MergeTree Int
forall a. Bounded a => a
maxBound] :: MergeTree Int),

   MergeTree Int
-> MergeTree Int -> MergeTree Int -> IO (TrackedErrors ())
forall a. (Eq a, Show a) => a -> a -> a -> IO (TrackedErrors ())
checkMatch2 ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAny [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
2,[MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAll [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
3,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
4]])
               ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAny [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
2,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
3,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
4])
               ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAny [[MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAny [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1],Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
2,[MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAll [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
3,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
4]] :: MergeTree Int),
   MergeTree Int
-> MergeTree Int -> MergeTree Int -> IO (TrackedErrors ())
forall a. (Eq a, Show a) => a -> a -> a -> IO (TrackedErrors ())
checkMatch2 ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAll [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
2,[MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAny [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
3,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
4]])
               ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAll [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
2,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
3,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
4])
               ([MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAll [[MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAll [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
1],Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
2,[MergeTree Int] -> MergeTree Int
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Int) -> MergeTree Int
mergeAny [Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
3,Int -> MergeTree Int
forall a. a -> MergeTree a
mergeLeaf Int
4]] :: MergeTree Int),

   -- a*(b&c)*(d|e) = (a*b&a*c)*(d|e) = (a*b*(d|e)&a*c*(d|e)) = (a*b*d|a*b*e)&(a*c*d|a*c*e)
   MergeTree String
-> ([MergeTree Char] -> MergeTree String)
-> [MergeTree Char]
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch ([MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAll [[MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAny [String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"abd",String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"abe"],[MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAny [String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"acd",String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"ace"]]) [MergeTree Char] -> MergeTree String
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence
              [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c'],[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'd',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'e']],

   MergeTree Char
-> (MergeTree Char -> MergeTree Char)
-> MergeTree Char
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'A'],
                         [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'B'],
                                   [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'C']]])
              (\MergeTree Char
x -> do
                Char
x' <- MergeTree Char
x
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
x',Char -> MergeTree Char
forall a. a -> MergeTree a
forall (m :: * -> *) a. Monad m => a -> m a
return (Char -> Char
toUpper Char
x')])
              ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c']]),

    [MergeTree Char]
-> (MergeTree String -> [MergeTree Char])
-> MergeTree String
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],
                          [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c',
                                    [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'd',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'e']],
                          Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'f']]
               MergeTree String -> [MergeTree Char]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a.
Monad m =>
MergeTree (m a) -> m (MergeTree a)
sequence  -- MergeTree [Char] -> [MergeTree Char]
               ([MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAll [[MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAny [String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"a",String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"b"],
                          [MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAny [String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"c",
                                    [MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAll [String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"d",String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"e"]],
                          String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"f"]),

    MergeTree String
-> ([MergeTree Char] -> MergeTree String)
-> [MergeTree Char]
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch ([MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAll [[MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAny [String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"a",String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"b"],
                          [MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAny [String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"c",
                                    [MergeTree String] -> MergeTree String
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree String) -> MergeTree String
mergeAll [String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"d",String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"e"]],
                          String -> MergeTree String
forall a. a -> MergeTree a
mergeLeaf String
"f"])
               [MergeTree Char] -> MergeTree String
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence  -- [MergeTree Char] -> MergeTree [Char]
               [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],
                          [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c',
                                    [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'd',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'e']],
                          Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'f']],

    MergeTree Char
-> (MergeTree Char -> MergeTree Char)
-> MergeTree Char
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'A',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'B'],
                          [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'C',
                                    [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'D',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'E']],
                          Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'F'])
               (Char -> Char
toUpper (Char -> Char) -> MergeTree Char -> MergeTree Char
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>)
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],
                          [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c',
                                    [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'd',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'e']],
                          Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'f']),

    MergeTree Char
-> (MergeTree (Char -> Char) -> MergeTree Char)
-> MergeTree (Char -> Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'A',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'B'],
                          [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'C',
                                    [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'D',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'E']],
                          Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'F'])
               (([MergeTree ((Char -> Char) -> Char)]
-> MergeTree ((Char -> Char) -> Char)
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree ((Char -> Char) -> Char))
-> MergeTree ((Char -> Char) -> Char)
mergeAll [[MergeTree ((Char -> Char) -> Char)]
-> MergeTree ((Char -> Char) -> Char)
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree ((Char -> Char) -> Char))
-> MergeTree ((Char -> Char) -> Char)
mergeAny [((Char -> Char) -> Char) -> MergeTree ((Char -> Char) -> Char)
forall a. a -> MergeTree a
mergeLeaf ((Char -> Char) -> Char -> Char
forall a b. (a -> b) -> a -> b
$Char
'a'),((Char -> Char) -> Char) -> MergeTree ((Char -> Char) -> Char)
forall a. a -> MergeTree a
mergeLeaf ((Char -> Char) -> Char -> Char
forall a b. (a -> b) -> a -> b
$Char
'b')],
                           [MergeTree ((Char -> Char) -> Char)]
-> MergeTree ((Char -> Char) -> Char)
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree ((Char -> Char) -> Char))
-> MergeTree ((Char -> Char) -> Char)
mergeAny [((Char -> Char) -> Char) -> MergeTree ((Char -> Char) -> Char)
forall a. a -> MergeTree a
mergeLeaf ((Char -> Char) -> Char -> Char
forall a b. (a -> b) -> a -> b
$Char
'c'),
                                     [MergeTree ((Char -> Char) -> Char)]
-> MergeTree ((Char -> Char) -> Char)
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree ((Char -> Char) -> Char))
-> MergeTree ((Char -> Char) -> Char)
mergeAll [((Char -> Char) -> Char) -> MergeTree ((Char -> Char) -> Char)
forall a. a -> MergeTree a
mergeLeaf ((Char -> Char) -> Char -> Char
forall a b. (a -> b) -> a -> b
$Char
'd'),((Char -> Char) -> Char) -> MergeTree ((Char -> Char) -> Char)
forall a. a -> MergeTree a
mergeLeaf ((Char -> Char) -> Char -> Char
forall a b. (a -> b) -> a -> b
$Char
'e')]],
                           ((Char -> Char) -> Char) -> MergeTree ((Char -> Char) -> Char)
forall a. a -> MergeTree a
mergeLeaf ((Char -> Char) -> Char -> Char
forall a b. (a -> b) -> a -> b
$Char
'f')]) MergeTree ((Char -> Char) -> Char)
-> MergeTree (Char -> Char) -> MergeTree Char
forall a b. MergeTree (a -> b) -> MergeTree a -> MergeTree b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>)
               ((Char -> Char) -> MergeTree (Char -> Char)
forall a. a -> MergeTree a
mergeLeaf Char -> Char
toUpper),

    Bool
-> ((MergeTree (), MergeTree ()) -> Bool)
-> (MergeTree (), MergeTree ())
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree () -> MergeTree () -> Bool)
-> (MergeTree (), MergeTree ()) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree () -> MergeTree () -> Bool)
 -> (MergeTree (), MergeTree ()) -> Bool)
-> (MergeTree () -> MergeTree () -> Bool)
-> (MergeTree (), MergeTree ())
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree ()) -> T (MergeTree ()) -> Bool)
-> MergeTree ()
-> MergeTree ()
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll () -> () -> Bool
T (MergeTree ()) -> T (MergeTree ()) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               (MergeTree ()
forall a. Bounded a => a
minBound :: MergeTree (),MergeTree ()
forall a. Bounded a => a
minBound :: MergeTree ()),
    Bool
-> ((MergeTree (), MergeTree ()) -> Bool)
-> (MergeTree (), MergeTree ())
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree () -> MergeTree () -> Bool)
-> (MergeTree (), MergeTree ()) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree () -> MergeTree () -> Bool)
 -> (MergeTree (), MergeTree ()) -> Bool)
-> (MergeTree () -> MergeTree () -> Bool)
-> (MergeTree (), MergeTree ())
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree ()) -> T (MergeTree ()) -> Bool)
-> MergeTree ()
-> MergeTree ()
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll () -> () -> Bool
T (MergeTree ()) -> T (MergeTree ()) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               (MergeTree ()
forall a. Bounded a => a
maxBound :: MergeTree (),MergeTree ()
forall a. Bounded a => a
maxBound :: MergeTree ()),
    Bool
-> ((MergeTree (), MergeTree ()) -> Bool)
-> (MergeTree (), MergeTree ())
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree () -> MergeTree () -> Bool)
-> (MergeTree (), MergeTree ()) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree () -> MergeTree () -> Bool)
 -> (MergeTree (), MergeTree ()) -> Bool)
-> (MergeTree () -> MergeTree () -> Bool)
-> (MergeTree (), MergeTree ())
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree ()) -> T (MergeTree ()) -> Bool)
-> MergeTree ()
-> MergeTree ()
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll () -> () -> Bool
T (MergeTree ()) -> T (MergeTree ()) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               (MergeTree ()
forall a. Bounded a => a
minBound :: MergeTree (),MergeTree ()
forall a. Bounded a => a
maxBound :: MergeTree ()),
    Bool
-> ((MergeTree (), MergeTree ()) -> Bool)
-> (MergeTree (), MergeTree ())
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
False
               ((MergeTree () -> MergeTree () -> Bool)
-> (MergeTree (), MergeTree ()) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree () -> MergeTree () -> Bool)
 -> (MergeTree (), MergeTree ()) -> Bool)
-> (MergeTree () -> MergeTree () -> Bool)
-> (MergeTree (), MergeTree ())
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree ()) -> T (MergeTree ()) -> Bool)
-> MergeTree ()
-> MergeTree ()
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll () -> () -> Bool
T (MergeTree ()) -> T (MergeTree ()) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               (MergeTree ()
forall a. Bounded a => a
maxBound :: MergeTree (),MergeTree ()
forall a. Bounded a => a
minBound :: MergeTree ()),

    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c']),
    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b']),
    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
False
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c']),
    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
False
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b']),
    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b']),
    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b']),

    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c']),
    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b']),
    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c']),
    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
True
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [[MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'c']),
    Bool
-> ((MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char, MergeTree Char)
-> IO (TrackedErrors ())
forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch Bool
False
               ((MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((MergeTree Char -> MergeTree Char -> Bool)
 -> (MergeTree Char, MergeTree Char) -> Bool)
-> (MergeTree Char -> MergeTree Char -> Bool)
-> (MergeTree Char, MergeTree Char)
-> Bool
forall a b. (a -> b) -> a -> b
$ ([Bool] -> Bool)
-> ([Bool] -> Bool)
-> (T (MergeTree Char) -> T (MergeTree Char) -> Bool)
-> MergeTree Char
-> MergeTree Char
-> Bool
forall a b c.
(PreserveMerge a, PreserveMerge b) =>
([c] -> c) -> ([c] -> c) -> (T a -> T b -> c) -> a -> b -> c
pairMergeTree [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny [Bool] -> Bool
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll Char -> Char -> Bool
T (MergeTree Char) -> T (MergeTree Char) -> Bool
forall a. Eq a => a -> a -> Bool
(==))
               ([MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAny [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'],
                [MergeTree Char] -> MergeTree Char
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *).
Foldable f =>
f (MergeTree Char) -> MergeTree Char
mergeAll [Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'a',Char -> MergeTree Char
forall a. a -> MergeTree a
mergeLeaf Char
'b'])
 ]

oddError :: Int -> TrackedErrors Int
oddError :: Int -> TrackedErrors Int
oddError Int
x = do
  Bool -> TrackedErrors () -> TrackedErrors ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int -> Bool
forall a. Integral a => a -> Bool
odd Int
x) (TrackedErrors () -> TrackedErrors ())
-> TrackedErrors () -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ String -> TrackedErrors ()
forall a. String -> TrackedErrorsT Identity a
forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM (String -> TrackedErrors ()) -> String -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" is odd"
  Int -> TrackedErrors Int
forall a. a -> TrackedErrorsT Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Int
x

oddError2 :: Int -> TrackedErrors [Int]
oddError2 :: Int -> TrackedErrors [Int]
oddError2 = (Int -> [Int]) -> TrackedErrors Int -> TrackedErrors [Int]
forall a b.
(a -> b) -> TrackedErrorsT Identity a -> TrackedErrorsT Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
:[]) (TrackedErrors Int -> TrackedErrors [Int])
-> (Int -> TrackedErrors Int) -> Int -> TrackedErrors [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> TrackedErrors Int
oddError

checkMatch :: (Eq b, Show b) => b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch :: forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch b
x a -> b
f a
y = let y' :: b
y' = a -> b
f a
y in
  TrackedErrors () -> IO (TrackedErrors ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (TrackedErrors () -> IO (TrackedErrors ()))
-> TrackedErrors () -> IO (TrackedErrors ())
forall a b. (a -> b) -> a -> b
$ if b
x b -> b -> Bool
forall a. Eq a => a -> a -> Bool
/= b
y'
              then String -> TrackedErrors ()
forall a. String -> TrackedErrorsT Identity a
forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM (String -> TrackedErrors ()) -> String -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ String
"Expected " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Show a => a -> String
show b
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" but got " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Show a => a -> String
show b
y'
              else () -> TrackedErrors ()
forall a. a -> TrackedErrorsT Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

checkMatch2 :: (Eq a, Show a) => a -> a -> a -> IO (TrackedErrors ())
checkMatch2 :: forall a. (Eq a, Show a) => a -> a -> a -> IO (TrackedErrors ())
checkMatch2 a
x a
y a
z = TrackedErrors () -> IO (TrackedErrors ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (TrackedErrors () -> IO (TrackedErrors ()))
-> TrackedErrors () -> IO (TrackedErrors ())
forall a b. (a -> b) -> a -> b
$ do
  Bool -> TrackedErrors () -> TrackedErrors ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
z) (TrackedErrors () -> TrackedErrors ())
-> TrackedErrors () -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ String -> TrackedErrors ()
forall a. String -> TrackedErrorsT Identity a
forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM (String -> TrackedErrors ()) -> String -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ String
"Expected " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" but got " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
z
  Bool -> TrackedErrors () -> TrackedErrors ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (a
y a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
z) (TrackedErrors () -> TrackedErrors ())
-> TrackedErrors () -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ String -> TrackedErrors ()
forall a. String -> TrackedErrorsT Identity a
forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM (String -> TrackedErrors ()) -> String -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ String
"Expected something besides " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
y

checkSuccess :: (Eq b, Show b) => b -> (a -> TrackedErrors b) -> a -> IO (TrackedErrors ())
checkSuccess :: forall b a.
(Eq b, Show b) =>
b -> (a -> TrackedErrors b) -> a -> IO (TrackedErrors ())
checkSuccess b
x a -> TrackedErrors b
f a
y = let y' :: TrackedErrors b
y' = a -> TrackedErrors b
f a
y in
  TrackedErrors () -> IO (TrackedErrors ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (TrackedErrors () -> IO (TrackedErrors ()))
-> TrackedErrors () -> IO (TrackedErrors ())
forall a b. (a -> b) -> a -> b
$ if TrackedErrors b -> Bool
forall (t :: (* -> *) -> * -> *) a.
(ErrorContextT t, ErrorContextM (t Identity)) =>
t Identity a -> Bool
isCompilerError TrackedErrors b
y' Bool -> Bool -> Bool
|| TrackedErrors b -> b
forall a. TrackedErrors a -> a
getCompilerSuccess TrackedErrors b
y' b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== b
x
              then TrackedErrors b
y' TrackedErrors b -> TrackedErrors () -> TrackedErrors ()
forall a b.
TrackedErrorsT Identity a
-> TrackedErrorsT Identity b -> TrackedErrorsT Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> TrackedErrors ()
forall a. a -> TrackedErrorsT Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
              else String -> TrackedErrors ()
forall a. String -> TrackedErrorsT Identity a
forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM (String -> TrackedErrors ()) -> String -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ String
"Expected value " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Show a => a -> String
show b
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" but got value " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Show a => a -> String
show (TrackedErrors b -> b
forall a. TrackedErrors a -> a
getCompilerSuccess TrackedErrors b
y')

checkError :: Show b => String -> (a -> TrackedErrors b) -> a -> IO (TrackedErrors ())
checkError :: forall b a.
Show b =>
String -> (a -> TrackedErrors b) -> a -> IO (TrackedErrors ())
checkError String
e a -> TrackedErrors b
f a
y = let y' :: TrackedErrors b
y' = a -> TrackedErrors b
f a
y in
  TrackedErrors () -> IO (TrackedErrors ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (TrackedErrors () -> IO (TrackedErrors ()))
-> TrackedErrors () -> IO (TrackedErrors ())
forall a b. (a -> b) -> a -> b
$ if Bool -> Bool
not (TrackedErrors b -> Bool
forall (t :: (* -> *) -> * -> *) a.
(ErrorContextT t, ErrorContextM (t Identity)) =>
t Identity a -> Bool
isCompilerError TrackedErrors b
y')
              then String -> TrackedErrors ()
forall a. String -> TrackedErrorsT Identity a
forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM (String -> TrackedErrors ()) -> String -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ String
"Expected error \"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
e String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\" but got value " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Show a => a -> String
show (TrackedErrors b -> b
forall a. TrackedErrors a -> a
getCompilerSuccess TrackedErrors b
y')
              else if CompilerMessage -> String
forall a. Show a => a -> String
show (TrackedErrors b -> CompilerMessage
forall a. TrackedErrors a -> CompilerMessage
getCompilerError TrackedErrors b
y') String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
e
                      then () -> TrackedErrors ()
forall a. a -> TrackedErrorsT Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
                      else String -> TrackedErrors ()
forall a. String -> TrackedErrorsT Identity a
forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM (String -> TrackedErrors ()) -> String -> TrackedErrors ()
forall a b. (a -> b) -> a -> b
$ String
"Expected error \"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
e String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\" but got error \"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ CompilerMessage -> String
forall a. Show a => a -> String
show (TrackedErrors b -> CompilerMessage
forall a. TrackedErrors a -> CompilerMessage
getCompilerError TrackedErrors b
y') String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\""