{-# LANGUAGE FlexibleContexts #-}

module Saturn.Unstable.Type.Wildcard where

import qualified Control.Monad as Monad
import qualified Data.Coerce as Coerce
import qualified Data.Text.Lazy.Builder as Builder
import qualified Text.Parsec as Parsec

newtype Wildcard
  = Wildcard ()
  deriving (Wildcard -> Wildcard -> Bool
(Wildcard -> Wildcard -> Bool)
-> (Wildcard -> Wildcard -> Bool) -> Eq Wildcard
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Wildcard -> Wildcard -> Bool
== :: Wildcard -> Wildcard -> Bool
$c/= :: Wildcard -> Wildcard -> Bool
/= :: Wildcard -> Wildcard -> Bool
Eq, Int -> Wildcard -> ShowS
[Wildcard] -> ShowS
Wildcard -> String
(Int -> Wildcard -> ShowS)
-> (Wildcard -> String) -> ([Wildcard] -> ShowS) -> Show Wildcard
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Wildcard -> ShowS
showsPrec :: Int -> Wildcard -> ShowS
$cshow :: Wildcard -> String
show :: Wildcard -> String
$cshowList :: [Wildcard] -> ShowS
showList :: [Wildcard] -> ShowS
Show)

fromUnit :: () -> Wildcard
fromUnit :: () -> Wildcard
fromUnit = () -> Wildcard
forall a b. Coercible a b => a -> b
Coerce.coerce

toUnit :: Wildcard -> ()
toUnit :: Wildcard -> ()
toUnit = Wildcard -> ()
forall a b. Coercible a b => a -> b
Coerce.coerce

parsec :: (Parsec.Stream s m Char) => Parsec.ParsecT s u m Wildcard
parsec :: forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Wildcard
parsec = (() -> Wildcard) -> ParsecT s u m () -> ParsecT s u m Wildcard
forall a b. (a -> b) -> ParsecT s u m a -> ParsecT s u m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap () -> Wildcard
fromUnit (ParsecT s u m () -> ParsecT s u m Wildcard)
-> (ParsecT s u m Char -> ParsecT s u m ())
-> ParsecT s u m Char
-> ParsecT s u m Wildcard
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT s u m Char -> ParsecT s u m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
Monad.void (ParsecT s u m Char -> ParsecT s u m Wildcard)
-> ParsecT s u m Char -> ParsecT s u m Wildcard
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
Parsec.char Char
'*'

toBuilder :: Wildcard -> Builder.Builder
toBuilder :: Wildcard -> Builder
toBuilder = Builder -> Wildcard -> Builder
forall a b. a -> b -> a
const (Builder -> Wildcard -> Builder) -> Builder -> Wildcard -> Builder
forall a b. (a -> b) -> a -> b
$ Char -> Builder
Builder.singleton Char
'*'