{-# LANGUAGE DataKinds #-} {-# LANGUAGE Safe #-} {-# LANGUAGE TypeFamilies #-} module Data.Path where data Path = L Path | R Path | Here deriving (Int -> Path -> ShowS [Path] -> ShowS Path -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Path] -> ShowS $cshowList :: [Path] -> ShowS show :: Path -> String $cshow :: Path -> String showsPrec :: Int -> Path -> ShowS $cshowsPrec :: Int -> Path -> ShowS Show) data MaybePath = NotFound | Conflict | Found Path deriving (Int -> MaybePath -> ShowS [MaybePath] -> ShowS MaybePath -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [MaybePath] -> ShowS $cshowList :: [MaybePath] -> ShowS show :: MaybePath -> String $cshow :: MaybePath -> String showsPrec :: Int -> MaybePath -> ShowS $cshowsPrec :: Int -> MaybePath -> ShowS Show) type family Combine p1 p2 where Combine ('Found path) 'NotFound = 'Found ('L path) Combine 'NotFound ('Found path) = 'Found ('R path) Combine 'NotFound 'NotFound = 'NotFound Combine _ _ = 'Conflict