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),
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 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
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
"\""