module Path(showPath, subPath, absPath, path, turn, here, Path(..)) where
import Direction
import Utils(lhead)

type Path = [Direction]

here :: Path
here :: Path
here = []

turn :: Direction -> Path -> Path
turn :: Direction -> Path -> Path
turn Direction
dir Path
p = Direction
dir Direction -> Path -> Path
forall a. a -> [a] -> [a]
: Path
p

path :: Path -> (Direction, Path)
path :: Path -> (Direction, Path)
path (Direction
dir : Path
p) = (Direction
dir, Path
p)
path [] = [Char] -> (Direction, Path)
forall a. HasCallStack => [Char] -> a
error [Char]
"path.m: path []"

absPath :: Path -> Path -> Path
absPath :: Path -> Path -> Path
absPath Path
absp Path
relp = Path
absp Path -> Path -> Path
forall a. [a] -> [a] -> [a]
++ Path
relp

subPath :: Path -> Path -> Bool
subPath :: Path -> Path -> Bool
subPath Path
subp Path
p = Path -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Path
subp Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Path -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Path
p Bool -> Bool -> Bool
&& Path -> Path -> Path
forall a1 a2. [a1] -> [a2] -> [a2]
lhead Path
subp Path
p Path -> Path -> Bool
forall a. Eq a => a -> a -> Bool
== Path
subp

showPath :: Path -> String
showPath :: Path -> [Char]
showPath =
    (Direction -> [Char]) -> Path -> [Char]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Direction
x ->
               case Direction
x of
                 Direction
L -> [Char]
"L"
                 Direction
R -> [Char]
"R"
                 Dno Int
n -> [Char]
"N(" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
n [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
")")