{-# 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