{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
module Showcase
(
Config (..)
, defaultConfig
, reallyLongFunctionNameThatGoesOnForQuiteAWhile
, withArgumentDocs
, withLongArgumentTypes
, Container (..)
, Convert (..)
, Describe (..)
, Indexed (..)
, Render (..)
, Tabulate (..)
, Expr (.., Zero)
, Showable (..)
, (>+<)
, oldFunction
, module Geometry
) where
import Geometry
data Config = Config
{ Config -> String
configName :: String
, Config -> Int -> Maybe (Int, Int)
configRetryPolicy :: Int -> Maybe (Int, Int)
, :: [(String, String)]
, Config -> Int
configConnectTimeoutMicroseconds :: Int
, Config -> Bool
configVerbose :: Bool
, Config -> forall a. Show a => a -> IO ()
configOnEvent :: forall a. (Show a) => a -> IO ()
, Config
-> Either String (Maybe [(String, Int)])
-> IO (Either String (Maybe [(Int, Int)]))
configResultHandler :: Either String (Maybe [(String, Int)]) -> IO (Either String (Maybe [(Int, Int)]))
}
defaultConfig :: Config
defaultConfig :: Config
defaultConfig =
Config
{ configName :: String
configName = String
"default"
, configRetryPolicy :: Int -> Maybe (Int, Int)
configRetryPolicy = Maybe (Int, Int) -> Int -> Maybe (Int, Int)
forall a b. a -> b -> a
const Maybe (Int, Int)
forall a. Maybe a
Nothing
, configExtraHeaders :: [(String, String)]
configExtraHeaders = []
, configConnectTimeoutMicroseconds :: Int
configConnectTimeoutMicroseconds = Int
1000000
, configVerbose :: Bool
configVerbose = Bool
False
, configOnEvent :: forall a. Show a => a -> IO ()
configOnEvent = IO () -> a -> IO ()
forall a b. a -> b -> a
const (() -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
, configResultHandler :: Either String (Maybe [(String, Int)])
-> IO (Either String (Maybe [(Int, Int)]))
configResultHandler = IO (Either String (Maybe [(Int, Int)]))
-> Either String (Maybe [(String, Int)])
-> IO (Either String (Maybe [(Int, Int)]))
forall a b. a -> b -> a
const (Either String (Maybe [(Int, Int)])
-> IO (Either String (Maybe [(Int, Int)]))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe [(Int, Int)] -> Either String (Maybe [(Int, Int)])
forall a b. b -> Either a b
Right Maybe [(Int, Int)]
forall a. Maybe a
Nothing))
}
reallyLongFunctionNameThatGoesOnForQuiteAWhile
:: (Eq a, Num a, Ord a, Show a)
=> a
-> a
-> a
-> Either String (a, a, a)
reallyLongFunctionNameThatGoesOnForQuiteAWhile :: forall a.
(Eq a, Num a, Ord a, Show a) =>
a -> a -> a -> Either String (a, a, a)
reallyLongFunctionNameThatGoesOnForQuiteAWhile a
x a
y a
z = (a, a, a) -> Either String (a, a, a)
forall a b. b -> Either a b
Right (a
x, a
y, a
z)
withArgumentDocs
:: Int
-> String
-> Bool
-> String
withArgumentDocs :: Int -> String -> Bool -> String
withArgumentDocs Int
n String
label Bool
loud = (if Bool
loud then String
"!" else String
"") String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
label String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n
withLongArgumentTypes
:: Config
-> (Int -> Either String (Maybe [(String, String)]))
-> [(String, Int -> IO ())]
-> IO ()
withLongArgumentTypes :: Config
-> (Int -> Either String (Maybe [(String, String)]))
-> [(String, Int -> IO ())]
-> IO ()
withLongArgumentTypes Config
_ Int -> Either String (Maybe [(String, String)])
_ [(String, Int -> IO ())]
_ = () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
class (Show (Elem c)) => Container c where
type Elem c
empty :: c
insert :: Elem c -> c -> c
size :: c -> Int
size c
_ = Int
0
instance (Show a) => Container [a] where
type Elem [a] = a
empty :: [a]
empty = []
insert :: Elem [a] -> [a] -> [a]
insert = (:)
size :: [a] -> Int
size = [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length
instance (Show a) => Container (Maybe a) where
type Elem (Maybe a) = a
empty :: Maybe a
empty = Maybe a
forall a. Maybe a
Nothing
insert :: Elem (Maybe a) -> Maybe a -> Maybe a
insert Elem (Maybe a)
x Maybe a
_ = a -> Maybe a
forall a. a -> Maybe a
Just a
Elem (Maybe a)
x
size :: Maybe a -> Int
size = Int -> (a -> Int) -> Maybe a -> Int
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Int
0 (Int -> a -> Int
forall a b. a -> b -> a
const Int
1)
class Convert a b where
convert :: a -> b
instance Convert (Either String (Maybe (Int, Int))) (Either String (Maybe [(String, [Bool])])) where
convert :: Either String (Maybe (Int, Int))
-> Either String (Maybe [(String, [Bool])])
convert Either String (Maybe (Int, Int))
_ = Maybe [(String, [Bool])]
-> Either String (Maybe [(String, [Bool])])
forall a b. b -> Either a b
Right Maybe [(String, [Bool])]
forall a. Maybe a
Nothing
class Describe a where
describe :: a -> String
instance Describe Bool where
describe :: Bool -> String
describe Bool
b = if Bool
b then String
"true" else String
"false"
instance Describe Char where
describe :: Char -> String
describe Char
c = [Char
c]
instance Describe Int where
describe :: Int -> String
describe = Int -> String
forall a. Show a => a -> String
show
instance Describe Integer where
describe :: Integer -> String
describe = Integer -> String
forall a. Show a => a -> String
show
instance Describe Float where
describe :: Float -> String
describe = Float -> String
forall a. Show a => a -> String
show
instance Describe Double where
describe :: Double -> String
describe = Double -> String
forall a. Show a => a -> String
show
instance Describe Ordering where
describe :: Ordering -> String
describe = Ordering -> String
forall a. Show a => a -> String
show
instance Describe () where
describe :: () -> String
describe ()
_ = String
"()"
instance (Describe a) => Describe [a] where
describe :: [a] -> String
describe = [String] -> String
unwords ([String] -> String) -> ([a] -> [String]) -> [a] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> String) -> [a] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map a -> String
forall a. Describe a => a -> String
describe
instance (Describe a) => Describe (Maybe a) where
describe :: Maybe a -> String
describe = String -> (a -> String) -> Maybe a -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe String
"nothing" a -> String
forall a. Describe a => a -> String
describe
instance (Describe a, Describe b) => Describe (Either a b) where
describe :: Either a b -> String
describe = (a -> String) -> (b -> String) -> Either a b -> String
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either a -> String
forall a. Describe a => a -> String
describe b -> String
forall a. Describe a => a -> String
describe
instance (Describe a, Describe b) => Describe (a, b) where
describe :: (a, b) -> String
describe (a
a, b
b) = a -> String
forall a. Describe a => a -> String
describe a
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Describe a => a -> String
describe b
b
instance (Describe a, Describe b, Describe c) => Describe (a, b, c) where
describe :: (a, b, c) -> String
describe (a
a, b
b, c
c) = a -> String
forall a. Describe a => a -> String
describe a
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Describe a => a -> String
describe b
b String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ c -> String
forall a. Describe a => a -> String
describe c
c
instance Describe Point where
describe :: Point -> String
describe (Point Double
x Double
y) = String
"(" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Double -> String
forall a. Show a => a -> String
show Double
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
", " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Double -> String
forall a. Show a => a -> String
show Double
y String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
class
(Bounded a, Enum a, Eq a, Integral a, Num a, Ord a, Read a, Real a, Show a) =>
Tabulate a
where
tabulate :: a -> String
tabulate = a -> String
forall a. Show a => a -> String
show
instance Tabulate Int
class (Eq c, Eq e, Show c, Show e) => Indexed c e | c -> e where
index :: c -> Int -> Maybe e
class Render a where
render :: a -> String
default render :: (Show a) => a -> String
render = a -> String
forall a. Show a => a -> String
show
data Expr a where
IntLit :: Int -> Expr Int
BoolLit :: Bool -> Expr Bool
Add :: Expr Int -> Expr Int -> Expr Int
If :: Expr Bool -> Expr a -> Expr a -> Expr a
Annotated :: String -> [(String, String)] -> Either String (Maybe (Expr a)) -> Maybe (Int, Int) -> Expr a
pattern Zero :: Expr Int
pattern $mZero :: forall {r}. Expr Int -> ((# #) -> r) -> ((# #) -> r) -> r
$bZero :: Expr Int
Zero = IntLit 0
data Showable = forall a. (Show a) => MkShowable a
(>+<) :: [a] -> [a] -> [a]
>+< :: forall a. [a] -> [a] -> [a]
(>+<) = [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
(++)
infixr 5 >+<
instance Semigroup Point where
Point Double
ax Double
ay <> :: Point -> Point -> Point
<> Point Double
bx Double
by = Double -> Double -> Point
Point (Double
ax Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
bx) (Double
ay Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
by)
oldFunction :: Int -> Int
oldFunction :: Int -> Int
oldFunction = (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
{-# DEPRECATED
oldFunction
"Use a newer function instead. This deprecation message is intentionally long so we can see how a multi-line warning notice renders once it wraps."
#-}