{-# LANGUAGE OverloadedStrings#-}

module Data.WKT.Helpers (module Data.WKT.Helpers) where
import Data.Maybe (isJust)
import Data.Text (Text)
import Data.Attoparsec.Text (Parser, skipSpace)
import Control.Applicative ((<|>))

generateZMString :: Maybe a -> Maybe a -> Text
generateZMString :: forall a. Maybe a -> Maybe a -> Text
generateZMString Maybe a
z' Maybe a
m'
    |Maybe a -> Bool
forall a. Maybe a -> Bool
isJust Maybe a
z' Bool -> Bool -> Bool
&& Maybe a -> Bool
forall a. Maybe a -> Bool
isJust Maybe a
m' = Text
" ZM "
    |Maybe a -> Bool
forall a. Maybe a -> Bool
isJust Maybe a
z' = Text
" Z "
    |Maybe a -> Bool
forall a. Maybe a -> Bool
isJust Maybe a
m' = Text
" M "
    |Bool
otherwise = Text
" "

showP :: Show a => a -> String
showP :: forall a. Show a => a -> String
showP = (String
"(" String -> String -> String
forall a. Semigroup a => a -> a -> a
<>) (String -> String) -> (a -> String) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
")") (String -> String) -> (a -> String) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show

allPairs :: [a] -> [(a,a)]
allPairs :: forall a. [a] -> [(a, a)]
allPairs [] = []
allPairs [a
_] = []
allPairs (a
x1:a
x2:[a]
xs) = (a
x1,a
x2) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [a] -> [(a, a)]
forall a. [a] -> [(a, a)]
allPairs (a
x2a -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs)

-- Parsers
zmParser :: Parser (Text, Text)
zmParser :: Parser (Text, Text)
zmParser = do
    Parser ()
skipSpace
    Text
zFlag <- Parser Text Text
"Z" Parser Text Text -> Parser Text Text -> Parser Text Text
forall a. Parser Text a -> Parser Text a -> Parser Text a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Text
"z" Parser Text Text -> Parser Text Text -> Parser Text Text
forall a. Parser Text a -> Parser Text a -> Parser Text a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Text
""
    Text
mFlag <- Parser Text Text
"M" Parser Text Text -> Parser Text Text -> Parser Text Text
forall a. Parser Text a -> Parser Text a -> Parser Text a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Text
"m" Parser Text Text -> Parser Text Text -> Parser Text Text
forall a. Parser Text a -> Parser Text a -> Parser Text a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Text
""
    Parser ()
skipSpace
    (Text, Text) -> Parser (Text, Text)
forall a. a -> Parser Text a
forall (m :: * -> *) a. Monad m => a -> m a
return (Text
zFlag, Text
mFlag)