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

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

   forall a. (Eq a, Show a) => a -> a -> a -> IO (TrackedErrors ())
checkMatch2 (forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAny [forall a. a -> MergeTree a
mergeLeaf Int
1,forall a. a -> MergeTree a
mergeLeaf Int
2,forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAll [forall a. a -> MergeTree a
mergeLeaf Int
3,forall a. a -> MergeTree a
mergeLeaf Int
4]])
               (forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAny [forall a. a -> MergeTree a
mergeLeaf Int
1,forall a. a -> MergeTree a
mergeLeaf Int
2,forall a. a -> MergeTree a
mergeLeaf Int
3,forall a. a -> MergeTree a
mergeLeaf Int
4])
               (forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAny [forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAny [forall a. a -> MergeTree a
mergeLeaf Int
1],forall a. a -> MergeTree a
mergeLeaf Int
2,forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAll [forall a. a -> MergeTree a
mergeLeaf Int
3,forall a. a -> MergeTree a
mergeLeaf Int
4]] :: MergeTree Int),
   forall a. (Eq a, Show a) => a -> a -> a -> IO (TrackedErrors ())
checkMatch2 (forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAll [forall a. a -> MergeTree a
mergeLeaf Int
1,forall a. a -> MergeTree a
mergeLeaf Int
2,forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAny [forall a. a -> MergeTree a
mergeLeaf Int
3,forall a. a -> MergeTree a
mergeLeaf Int
4]])
               (forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAll [forall a. a -> MergeTree a
mergeLeaf Int
1,forall a. a -> MergeTree a
mergeLeaf Int
2,forall a. a -> MergeTree a
mergeLeaf Int
3,forall a. a -> MergeTree a
mergeLeaf Int
4])
               (forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAll [forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAll [forall a. a -> MergeTree a
mergeLeaf Int
1],forall a. a -> MergeTree a
mergeLeaf Int
2,forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAny [forall a. a -> MergeTree a
mergeLeaf Int
3,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)
   forall b a.
(Eq b, Show b) =>
b -> (a -> b) -> a -> IO (TrackedErrors ())
checkMatch (forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAll [forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAny [forall a. a -> MergeTree a
mergeLeaf String
"abd",forall a. a -> MergeTree a
mergeLeaf String
"abe"],forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAny [forall a. a -> MergeTree a
mergeLeaf String
"acd",forall a. a -> MergeTree a
mergeLeaf String
"ace"]]) forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence
              [forall a. a -> MergeTree a
mergeLeaf Char
'a',forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAll [forall a. a -> MergeTree a
mergeLeaf Char
'b',forall a. a -> MergeTree a
mergeLeaf Char
'c'],forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
mergeAny [forall a. a -> MergeTree a
mergeLeaf Char
'd',forall a. a -> MergeTree a
mergeLeaf Char
'e']],

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

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

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

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

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

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

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

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

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

oddError2 :: Int -> TrackedErrors [Int]
oddError2 :: Int -> TrackedErrors [Int]
oddError2 = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. a -> [a] -> [a]
:[]) 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
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ if b
x forall a. Eq a => a -> a -> Bool
/= b
y'
              then forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM forall a b. (a -> b) -> a -> b
$ String
"Expected " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show b
x forall a. [a] -> [a] -> [a]
++ String
" but got " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show b
y'
              else 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 = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ do
  forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (a
x forall a. Eq a => a -> a -> Bool
/= a
z) forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM forall a b. (a -> b) -> a -> b
$ String
"Expected " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show a
x forall a. [a] -> [a] -> [a]
++ String
" but got " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show a
z
  forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (a
y forall a. Eq a => a -> a -> Bool
== a
z) forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM forall a b. (a -> b) -> a -> b
$ String
"Expected something besides " forall a. [a] -> [a] -> [a]
++ 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
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ if forall (t :: (* -> *) -> * -> *) a.
(ErrorContextT t, ErrorContextM (t Identity)) =>
t Identity a -> Bool
isCompilerError TrackedErrors b
y' Bool -> Bool -> Bool
|| forall a. TrackedErrors a -> a
getCompilerSuccess TrackedErrors b
y' forall a. Eq a => a -> a -> Bool
== b
x
              then TrackedErrors b
y' forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return ()
              else forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM forall a b. (a -> b) -> a -> b
$ String
"Expected value " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show b
x forall a. [a] -> [a] -> [a]
++ String
" but got value " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (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
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ if Bool -> Bool
not (forall (t :: (* -> *) -> * -> *) a.
(ErrorContextT t, ErrorContextM (t Identity)) =>
t Identity a -> Bool
isCompilerError TrackedErrors b
y')
              then forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM forall a b. (a -> b) -> a -> b
$ String
"Expected error \"" forall a. [a] -> [a] -> [a]
++ String
e forall a. [a] -> [a] -> [a]
++ String
"\" but got value " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall a. TrackedErrors a -> a
getCompilerSuccess TrackedErrors b
y')
              else if forall a. Show a => a -> String
show (forall a. TrackedErrors a -> CompilerMessage
getCompilerError TrackedErrors b
y') forall a. Eq a => a -> a -> Bool
== String
e
                      then forall (m :: * -> *) a. Monad m => a -> m a
return ()
                      else forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM forall a b. (a -> b) -> a -> b
$ String
"Expected error \"" forall a. [a] -> [a] -> [a]
++ String
e forall a. [a] -> [a] -> [a]
++ String
"\" but got error \"" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall a. TrackedErrors a -> CompilerMessage
getCompilerError TrackedErrors b
y') forall a. [a] -> [a] -> [a]
++ String
"\""