module Util.SameShape where

import Data.Tree



--class SameShape a b where
--    sameShape :: a -> b -> Bool

--instance (SameShape1 f) => SameShape (f a) (f b) where
--    sameShape x y = sameShape1 x y
--instance (SameShape2 f) => SameShape (f a b) (f c d) where
--    sameShape x y = sameShape2 x y

class SameShape1 f where
    sameShape1 :: f a -> f b -> Bool
class SameShape2 f where
    sameShape2 :: f a b -> f c d -> Bool


instance SameShape1 [] where
    sameShape1 [] [] = True
    sameShape1 (_:xs) (_:ys) = sameShape1 xs ys
    sameShape1 _ _ = False

instance SameShape1 Tree where
    sameShape1 (Node _ xs) (Node _ ys) = f xs ys where
        f [] [] = True
        f (x:xs) (y:ys) = sameShape1 x y && f xs ys
        f _ _ = False

instance SameShape1 Maybe where
    sameShape1 (Just _) (Just _) = True
    sameShape1 Nothing Nothing = True
    sameShape1 _ _ = False

instance SameShape2 Either where
    sameShape2 (Left _) (Left _) = True
    sameShape2 (Right _) (Right _) = True
    sameShape2 _ _ = False

instance SameShape1 IO where
    sameShape1 _ _ = True