-- This file is part of Goatee.
--
-- Copyright 2014-2021 Bryan Gardiner
--
-- Goatee is free software: you can redistribute it and/or modify
-- it under the terms of the GNU Affero General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Goatee is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU Affero General Public License for more details.
--
-- You should have received a copy of the GNU Affero General Public License
-- along with Goatee.  If not, see <http://www.gnu.org/licenses/>.

{-# LANGUAGE CPP #-}

-- | Renderers of property values.
--
-- Import "Game.Goatee.Lib.Property" rather than importing this module.
module Game.Goatee.Lib.Property.Renderer (
  renderColorBracketed,
  renderColorPretty,
  renderCoordElistBracketed,
  renderCoordElistPretty,
  renderCoordListBracketed,
  renderCoordListPretty,
  renderCoordPairListBracketed,
  renderCoordPairListPretty,
  renderDoubleBracketed,
  renderDoublePretty,
  renderGameResultBracketed,
  renderGameResultPretty,
  renderGameResultPretty',
  renderIntegralBracketed,
  renderIntegralPretty,
  renderLabelListBracketed,
  renderLabelListPretty,
  renderLineListBracketed,
  renderLineListPretty,
  renderMoveBracketed,
  renderMovePretty,
  renderNoneBracketed,
  renderNonePretty,
  renderRealBracketed,
  renderRealPretty,
  renderRulesetBracketed,
  renderRulesetPretty,
  renderSimpleTextBracketed,
  renderSimpleTextPairBracketed,
  renderSimpleTextPairPretty,
  renderSimpleTextPretty,
  renderSizeBracketed,
  renderSizePretty,
  renderTextBracketed,
  renderTextPretty,
  renderUnknownPropertyBracketed,
  renderUnknownPropertyPretty,
  renderVariationModeBracketed,
  renderVariationModePretty,
  ) where

import Control.Monad (forM_, void, when)
#if MIN_VERSION_mtl(2,2,1)
import Control.Monad.Except (throwError)
#else
import Control.Monad.Error (throwError)
#endif
import Control.Monad.Writer (tell)
import Data.Char (chr, ord)
import Data.List (intersperse)
import qualified Game.Goatee.Common.Bigfloat as BF
import Game.Goatee.Lib.Renderer
import Game.Goatee.Lib.Types

{-# ANN module "HLint: ignore Use <$>" #-}

-- Internal renderers not corresponding to any particular value type.

bracketed :: Render () -> Render ()
bracketed :: Render () -> Render ()
bracketed Render ()
x = [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"[" Render () -> Render () -> Render ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Render ()
x Render () -> Render () -> Render ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"]"

renderLine :: Int -> Render ()
renderLine :: Int -> Render ()
renderLine = [Char] -> (Int -> Render ()) -> Int -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"line" ((Int -> Render ()) -> Int -> Render ())
-> (Int -> Render ()) -> Int -> Render ()
forall a b. (a -> b) -> a -> b
$ \Int
x ->
  if Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
52
  then [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Int -> Char
chr (Int -> Char) -> Int -> Char
forall a b. (a -> b) -> a -> b
$ Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (if Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
26 then Char -> Int
ord Char
'a' else Char -> Int
ord Char
'A' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
26)]
  else [Char] -> Render ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError ([Char] -> Render ()) -> [Char] -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char]
"renderLine: Index not in [0, 52): " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
x

renderCoord :: Coord -> Render ()
renderCoord :: Coord -> Render ()
renderCoord = [Char] -> (Coord -> Render ()) -> Coord -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord" ((Coord -> Render ()) -> Coord -> Render ())
-> (Coord -> Render ()) -> Coord -> Render ()
forall a b. (a -> b) -> a -> b
$ \(Int
x, Int
y) -> Int -> Render ()
renderLine Int
x Render () -> Render () -> Render ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Int -> Render ()
renderLine Int
y

renderCoordBracketed :: Coord -> Render ()
renderCoordBracketed :: Coord -> Render ()
renderCoordBracketed = (Render () -> Render ())
-> (Coord -> Render ()) -> Coord -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed Coord -> Render ()
renderCoord

renderCoordPretty :: Coord -> Render ()
renderCoordPretty :: Coord -> Render ()
renderCoordPretty = [Char] -> (Coord -> Render ()) -> Coord -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord pretty" ((Coord -> Render ()) -> Coord -> Render ())
-> (Coord -> Render ()) -> Coord -> Render ()
forall a b. (a -> b) -> a -> b
$ \(Int
x, Int
y) ->
  ([Char] -> Render ()) -> [[Char]] -> Render ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [[Char]
"(", Int -> [Char]
forall a. Show a => a -> [Char]
show Int
x, [Char]
", ", Int -> [Char]
forall a. Show a => a -> [Char]
show Int
y, [Char]
")"]

renderCoordPairPretty :: (Coord, Coord) -> Render ()
renderCoordPairPretty :: (Coord, Coord) -> Render ()
renderCoordPairPretty = [Char]
-> ((Coord, Coord) -> Render ()) -> (Coord, Coord) -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord pair pretty" (((Coord, Coord) -> Render ()) -> (Coord, Coord) -> Render ())
-> ((Coord, Coord) -> Render ()) -> (Coord, Coord) -> Render ()
forall a b. (a -> b) -> a -> b
$ \(Coord
a, Coord
b) -> do
  Coord -> Render ()
renderCoordPretty Coord
a
  [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"-"
  Coord -> Render ()
renderCoordPretty Coord
b

renderCoordPair :: (Coord, Coord) -> Render ()
renderCoordPair :: (Coord, Coord) -> Render ()
renderCoordPair = [Char]
-> ((Coord, Coord) -> Render ()) -> (Coord, Coord) -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord pair" (((Coord, Coord) -> Render ()) -> (Coord, Coord) -> Render ())
-> ((Coord, Coord) -> Render ()) -> (Coord, Coord) -> Render ()
forall a b. (a -> b) -> a -> b
$ \(Coord
a, Coord
b) ->
  Coord -> Render ()
renderCoord Coord
a Render () -> Render () -> Render ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
":" Render () -> Render () -> Render ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Coord -> Render ()
renderCoord Coord
b

renderCoordPairBracketed :: (Coord, Coord) -> Render ()
renderCoordPairBracketed :: (Coord, Coord) -> Render ()
renderCoordPairBracketed = (Render () -> Render ())
-> ((Coord, Coord) -> Render ()) -> (Coord, Coord) -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed (Coord, Coord) -> Render ()
renderCoordPair

renderShowable :: Show a => a -> Render ()
renderShowable :: a -> Render ()
renderShowable = [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> (a -> [Char]) -> a -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [Char]
forall a. Show a => a -> [Char]
show

renderStringlike :: (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike :: Bool -> a -> Render ()
renderStringlike Bool
isComposed =
  [Char] -> (a -> Render ()) -> a -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf (if Bool
isComposed then [Char]
"composed stringlike" else [Char]
"stringlike") ((a -> Render ()) -> a -> Render ())
-> (a -> Render ()) -> a -> Render ()
forall a b. (a -> b) -> a -> b
$ \a
str ->
  [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> [Char] -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> [Char]
escape ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$ a -> [Char]
forall a. Stringlike a => a -> [Char]
sgfToString a
str
  where escape :: [Char] -> [Char]
escape [] = []
        escape (Char
first:[Char]
rest) | Char
first Char -> [Char] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Char]
specialChars = Char
'\\'Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:Char
firstChar -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:[Char] -> [Char]
escape [Char]
rest
                            | Bool
otherwise = Char
firstChar -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:[Char] -> [Char]
escape [Char]
rest
        -- TODO Deduplicate these characters with the parser:
        specialChars :: [Char]
specialChars = if Bool
isComposed then [Char]
":]\\" else [Char]
"]\\"

-- Note that unlike the serialized SGF version, we don't care about escaping
-- characters in composed strings.
renderStringlikePretty :: (Show a, Stringlike a) => a -> Render ()
renderStringlikePretty :: a -> Render ()
renderStringlikePretty = [Char] -> (a -> Render ()) -> a -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"stringlike pretty" ((a -> Render ()) -> a -> Render ())
-> (a -> Render ()) -> a -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> (a -> [Char]) -> a -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [Char]
forall a. Stringlike a => a -> [Char]
sgfToString

-- Public renderers.

renderColorBracketed :: Color -> Render ()
renderColorBracketed :: Color -> Render ()
renderColorBracketed Color
color = Render () -> Render ()
bracketed (Render () -> Render ()) -> Render () -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> [Char] -> Render ()
forall a b. (a -> b) -> a -> b
$ case Color
color of
  Color
Black -> [Char]
"B"
  Color
White -> [Char]
"W"

renderColorPretty :: Color -> Render ()
renderColorPretty :: Color -> Render ()
renderColorPretty Color
Black = [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"Black"
renderColorPretty Color
White = [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"White"

renderCoordElistBracketed :: CoordList -> Render ()
renderCoordElistBracketed :: CoordList -> Render ()
renderCoordElistBracketed = [Char] -> (CoordList -> Render ()) -> CoordList -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord elist bracketed" ((CoordList -> Render ()) -> CoordList -> Render ())
-> (CoordList -> Render ()) -> CoordList -> Render ()
forall a b. (a -> b) -> a -> b
$ \CoordList
list ->
  if [Coord] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Coord] -> Bool) -> [Coord] -> Bool
forall a b. (a -> b) -> a -> b
$ CoordList -> [Coord]
expandCoordList CoordList
list
  then [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"[]"
  else CoordList -> Render ()
renderCoordListNonempty CoordList
list

renderCoordElistPretty :: CoordList -> Render ()
renderCoordElistPretty :: CoordList -> Render ()
renderCoordElistPretty = [Char] -> (CoordList -> Render ()) -> CoordList -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord elist pretty" ((CoordList -> Render ()) -> CoordList -> Render ())
-> (CoordList -> Render ()) -> CoordList -> Render ()
forall a b. (a -> b) -> a -> b
$ \CoordList
list ->
  if [Coord] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Coord] -> Bool) -> [Coord] -> Bool
forall a b. (a -> b) -> a -> b
$ CoordList -> [Coord]
expandCoordList CoordList
list
  then [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"empty"
  else CoordList -> Render ()
renderCoordListNonemptyPretty CoordList
list

renderCoordListBracketed :: CoordList -> Render ()
renderCoordListBracketed :: CoordList -> Render ()
renderCoordListBracketed = [Char] -> (CoordList -> Render ()) -> CoordList -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord list bracketed" ((CoordList -> Render ()) -> CoordList -> Render ())
-> (CoordList -> Render ()) -> CoordList -> Render ()
forall a b. (a -> b) -> a -> b
$ \CoordList
list ->
  if [Coord] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Coord] -> Bool) -> [Coord] -> Bool
forall a b. (a -> b) -> a -> b
$ CoordList -> [Coord]
expandCoordList CoordList
list
  then [Char] -> Render ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError [Char]
"renderCoordListBracketed: Unexpected empty CoordList."
  else CoordList -> Render ()
renderCoordListNonempty CoordList
list

renderCoordListPretty :: CoordList -> Render ()
renderCoordListPretty :: CoordList -> Render ()
renderCoordListPretty = [Char] -> (CoordList -> Render ()) -> CoordList -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord list pretty" ((CoordList -> Render ()) -> CoordList -> Render ())
-> (CoordList -> Render ()) -> CoordList -> Render ()
forall a b. (a -> b) -> a -> b
$ \CoordList
list ->
  if [Coord] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Coord] -> Bool) -> [Coord] -> Bool
forall a b. (a -> b) -> a -> b
$ CoordList -> [Coord]
expandCoordList CoordList
list
  then [Char] -> Render ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError [Char]
"renderCoordListPretty: Unexpected empty CoordList."
  else CoordList -> Render ()
renderCoordListNonemptyPretty CoordList
list

renderCoordListNonempty :: CoordList -> Render ()
renderCoordListNonempty :: CoordList -> Render ()
renderCoordListNonempty = [Char] -> (CoordList -> Render ()) -> CoordList -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord list nonempty" ((CoordList -> Render ()) -> CoordList -> Render ())
-> (CoordList -> Render ()) -> CoordList -> Render ()
forall a b. (a -> b) -> a -> b
$ \CoordList
list -> do
  ((Coord, Coord) -> Render ()) -> [(Coord, Coord)] -> Render ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Coord, Coord) -> Render ()
renderCoordPairBracketed ([(Coord, Coord)] -> Render ()) -> [(Coord, Coord)] -> Render ()
forall a b. (a -> b) -> a -> b
$ CoordList -> [(Coord, Coord)]
coordListRects CoordList
list
  (Coord -> Render ()) -> [Coord] -> Render ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Coord -> Render ()
renderCoordBracketed ([Coord] -> Render ()) -> [Coord] -> Render ()
forall a b. (a -> b) -> a -> b
$ CoordList -> [Coord]
coordListSingles CoordList
list

renderCoordListNonemptyPretty :: CoordList -> Render ()
renderCoordListNonemptyPretty :: CoordList -> Render ()
renderCoordListNonemptyPretty = [Char] -> (CoordList -> Render ()) -> CoordList -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord list nonempty pretty" ((CoordList -> Render ()) -> CoordList -> Render ())
-> (CoordList -> Render ()) -> CoordList -> Render ()
forall a b. (a -> b) -> a -> b
$ \CoordList
list ->
  [Render ()] -> Render ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ ([Render ()] -> Render ()) -> [Render ()] -> Render ()
forall a b. (a -> b) -> a -> b
$ Render () -> [Render ()] -> [Render ()]
forall a. a -> [a] -> [a]
intersperse ([Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
", ") ([Render ()] -> [Render ()]) -> [Render ()] -> [Render ()]
forall a b. (a -> b) -> a -> b
$
  ((Coord, Coord) -> Render ()) -> [(Coord, Coord)] -> [Render ()]
forall a b. (a -> b) -> [a] -> [b]
map (Coord, Coord) -> Render ()
renderCoordPairPretty (CoordList -> [(Coord, Coord)]
coordListRects CoordList
list) [Render ()] -> [Render ()] -> [Render ()]
forall a. [a] -> [a] -> [a]
++
  (Coord -> Render ()) -> [Coord] -> [Render ()]
forall a b. (a -> b) -> [a] -> [b]
map Coord -> Render ()
renderCoordPretty (CoordList -> [Coord]
coordListSingles CoordList
list)

renderCoordPairListBracketed :: [(Coord, Coord)] -> Render ()
renderCoordPairListBracketed :: [(Coord, Coord)] -> Render ()
renderCoordPairListBracketed = [Char]
-> ([(Coord, Coord)] -> Render ()) -> [(Coord, Coord)] -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"coord pair list bracketed" (([(Coord, Coord)] -> Render ()) -> [(Coord, Coord)] -> Render ())
-> ([(Coord, Coord)] -> Render ()) -> [(Coord, Coord)] -> Render ()
forall a b. (a -> b) -> a -> b
$ \[(Coord, Coord)]
list ->
  if [(Coord, Coord)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Coord, Coord)]
list
  then [Char] -> Render ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError [Char]
"renderCoordPairListBracketed: Unexpected empty list."
  else ((Coord, Coord) -> Render ()) -> [(Coord, Coord)] -> Render ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Coord, Coord) -> Render ()
renderCoordPairBracketed [(Coord, Coord)]
list

renderCoordPairListPretty :: [(Coord, Coord)] -> Render ()
renderCoordPairListPretty :: [(Coord, Coord)] -> Render ()
renderCoordPairListPretty [(Coord, Coord)]
list =
  if [(Coord, Coord)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Coord, Coord)]
list
  then [Char] -> Render ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError [Char]
"renderCoordPairListPretty: Unexpected empty list."
  else [Render ()] -> Render ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ ([Render ()] -> Render ()) -> [Render ()] -> Render ()
forall a b. (a -> b) -> a -> b
$ Render () -> [Render ()] -> [Render ()]
forall a. a -> [a] -> [a]
intersperse ([Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
", ") ([Render ()] -> [Render ()]) -> [Render ()] -> [Render ()]
forall a b. (a -> b) -> a -> b
$ ((Coord, Coord) -> Render ()) -> [(Coord, Coord)] -> [Render ()]
forall a b. (a -> b) -> [a] -> [b]
map (Coord, Coord) -> Render ()
renderCoordPairPretty [(Coord, Coord)]
list

renderDoubleBracketed :: DoubleValue -> Render ()
renderDoubleBracketed :: DoubleValue -> Render ()
renderDoubleBracketed = (Render () -> Render ())
-> (DoubleValue -> Render ()) -> DoubleValue -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed ((DoubleValue -> Render ()) -> DoubleValue -> Render ())
-> (DoubleValue -> Render ()) -> DoubleValue -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> (DoubleValue -> Render ()) -> DoubleValue -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"double" ((DoubleValue -> Render ()) -> DoubleValue -> Render ())
-> (DoubleValue -> Render ()) -> DoubleValue -> Render ()
forall a b. (a -> b) -> a -> b
$ \DoubleValue
double -> [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> [Char] -> Render ()
forall a b. (a -> b) -> a -> b
$ case DoubleValue
double of
  DoubleValue
Double1 -> [Char]
"1"
  DoubleValue
Double2 -> [Char]
"2"

renderDoublePretty :: DoubleValue -> Render ()
renderDoublePretty :: DoubleValue -> Render ()
renderDoublePretty = [Char] -> (DoubleValue -> Render ()) -> DoubleValue -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"double pretty" ((DoubleValue -> Render ()) -> DoubleValue -> Render ())
-> (DoubleValue -> Render ()) -> DoubleValue -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ())
-> (DoubleValue -> [Char]) -> DoubleValue -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \DoubleValue
double -> case DoubleValue
double of
  DoubleValue
Double1 -> [Char]
"1"
  DoubleValue
Double2 -> [Char]
"2"

renderGameResultBracketed :: GameResult -> Render ()
renderGameResultBracketed :: GameResult -> Render ()
renderGameResultBracketed = (Render () -> Render ())
-> (GameResult -> Render ()) -> GameResult -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed ((GameResult -> Render ()) -> GameResult -> Render ())
-> (GameResult -> Render ()) -> GameResult -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> (GameResult -> Render ()) -> GameResult -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"game result" ((GameResult -> Render ()) -> GameResult -> Render ())
-> (GameResult -> Render ()) -> GameResult -> Render ()
forall a b. (a -> b) -> a -> b
$ \GameResult
result -> case GameResult
result of
  GameResultWin Color
color WinReason
reason ->
    [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> [Char] -> Render ()
forall a b. (a -> b) -> a -> b
$
    (case Color
color of { Color
Black -> Char
'B'; Color
White -> Char
'W' }) Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Char
'+' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:
    (case WinReason
reason of
        WinByScore RealValue
diff -> RealValue -> [Char]
forall a. Show a => a -> [Char]
show RealValue
diff
        WinReason
WinByResignation -> [Char]
"R"
        WinReason
WinByTime -> [Char]
"T"
        WinReason
WinByForfeit -> [Char]
"F")
  GameResult
GameResultDraw -> [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"0"
  GameResult
GameResultVoid -> [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"Void"
  GameResult
GameResultUnknown -> [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"?"
  GameResultOther SimpleText
text -> Bool -> SimpleText -> Render ()
forall a. (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike Bool
False SimpleText
text

renderGameResultPretty :: GameResult -> Render ()
renderGameResultPretty :: GameResult -> Render ()
renderGameResultPretty =
  [Char] -> (GameResult -> Render ()) -> GameResult -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"game result pretty" ((GameResult -> Render ()) -> GameResult -> Render ())
-> (GameResult -> Render ()) -> GameResult -> Render ()
forall a b. (a -> b) -> a -> b
$ Render () -> Render ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Render () -> Render ())
-> (GameResult -> Render ()) -> GameResult -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ())
-> (GameResult -> [Char]) -> GameResult -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GameResult -> [Char]
renderGameResultPretty'

renderGameResultPretty' :: GameResult -> String
renderGameResultPretty' :: GameResult -> [Char]
renderGameResultPretty' GameResult
result = case GameResult
result of
  GameResultWin Color
color WinReason
reason ->
    (case Color
color of { Color
Black -> Char
'B'; Color
White -> Char
'W' }) Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Char
'+' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:
    (case WinReason
reason of
        WinByScore RealValue
diff -> RealValue -> [Char]
forall a. Show a => a -> [Char]
show RealValue
diff
        WinReason
WinByResignation -> [Char]
"Resign"
        WinReason
WinByTime -> [Char]
"Time"
        WinReason
WinByForfeit -> [Char]
"Forfeit")
  GameResult
GameResultDraw -> [Char]
"Draw"
  GameResult
GameResultVoid -> [Char]
"Void"
  GameResult
GameResultUnknown -> [Char]
"Unknown"
  GameResultOther SimpleText
text -> SimpleText -> [Char]
forall a. Stringlike a => a -> [Char]
sgfToString SimpleText
text

renderIntegralBracketed :: (Integral a, Show a) => a -> Render ()
renderIntegralBracketed :: a -> Render ()
renderIntegralBracketed = Render () -> Render ()
bracketed (Render () -> Render ()) -> (a -> Render ()) -> a -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> (a -> Render ()) -> a -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"integral" a -> Render ()
forall a. Show a => a -> Render ()
renderShowable

renderIntegralPretty :: (Integral a, Show a) => a -> Render ()
renderIntegralPretty :: a -> Render ()
renderIntegralPretty = [Char] -> (a -> Render ()) -> a -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"integral pretty" a -> Render ()
forall a. Show a => a -> Render ()
renderShowable

renderLabelListBracketed :: [(Coord, SimpleText)] -> Render ()
renderLabelListBracketed :: [(Coord, SimpleText)] -> Render ()
renderLabelListBracketed = [Char]
-> ([(Coord, SimpleText)] -> Render ())
-> [(Coord, SimpleText)]
-> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"label list" (([(Coord, SimpleText)] -> Render ())
 -> [(Coord, SimpleText)] -> Render ())
-> ([(Coord, SimpleText)] -> Render ())
-> [(Coord, SimpleText)]
-> Render ()
forall a b. (a -> b) -> a -> b
$ \[(Coord, SimpleText)]
list ->
  if [(Coord, SimpleText)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Coord, SimpleText)]
list
  then [Char] -> Render ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError [Char]
"renderLabelListBracketed: Unexpected empty list."
  else [(Coord, SimpleText)]
-> ((Coord, SimpleText) -> Render ()) -> Render ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [(Coord, SimpleText)]
list (((Coord, SimpleText) -> Render ()) -> Render ())
-> ((Coord, SimpleText) -> Render ()) -> Render ()
forall a b. (a -> b) -> a -> b
$ Render () -> Render ()
bracketed (Render () -> Render ())
-> ((Coord, SimpleText) -> Render ())
-> (Coord, SimpleText)
-> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \(Coord
coord, SimpleText
text) -> do
    Coord -> Render ()
renderCoord Coord
coord
    [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
":"
    Bool -> SimpleText -> Render ()
forall a. (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike Bool
True SimpleText
text

renderLabelListPretty :: [(Coord, SimpleText)] -> Render ()
renderLabelListPretty :: [(Coord, SimpleText)] -> Render ()
renderLabelListPretty = [Char]
-> ([(Coord, SimpleText)] -> Render ())
-> [(Coord, SimpleText)]
-> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"label list pretty" (([(Coord, SimpleText)] -> Render ())
 -> [(Coord, SimpleText)] -> Render ())
-> ([(Coord, SimpleText)] -> Render ())
-> [(Coord, SimpleText)]
-> Render ()
forall a b. (a -> b) -> a -> b
$ \[(Coord, SimpleText)]
list ->
  if [(Coord, SimpleText)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Coord, SimpleText)]
list
  then [Char] -> Render ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError [Char]
"renderLabelListPretty: Unexpected empty list."
  else [Render ()] -> Render ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ ([Render ()] -> Render ()) -> [Render ()] -> Render ()
forall a b. (a -> b) -> a -> b
$ Render () -> [Render ()] -> [Render ()]
forall a. a -> [a] -> [a]
intersperse ([Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
", ") ([Render ()] -> [Render ()]) -> [Render ()] -> [Render ()]
forall a b. (a -> b) -> a -> b
$
       ((Coord, SimpleText) -> Render ())
-> [(Coord, SimpleText)] -> [Render ()]
forall a b. (a -> b) -> [a] -> [b]
map (\(Coord
coord, SimpleText
text) -> do
               Coord -> Render ()
renderCoordPretty Coord
coord
               [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
":"
               SimpleText -> Render ()
forall a. (Show a, Stringlike a) => a -> Render ()
renderStringlikePretty SimpleText
text)
       [(Coord, SimpleText)]
list

renderLineListBracketed :: [Line] -> Render ()
renderLineListBracketed :: [Line] -> Render ()
renderLineListBracketed = [Char] -> ([Line] -> Render ()) -> [Line] -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"line list bracketed" (([Line] -> Render ()) -> [Line] -> Render ())
-> ([Line] -> Render ()) -> [Line] -> Render ()
forall a b. (a -> b) -> a -> b
$
  [(Coord, Coord)] -> Render ()
renderCoordPairListBracketed ([(Coord, Coord)] -> Render ())
-> ([Line] -> [(Coord, Coord)]) -> [Line] -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Line -> (Coord, Coord)) -> [Line] -> [(Coord, Coord)]
forall a b. (a -> b) -> [a] -> [b]
map Line -> (Coord, Coord)
lineToPair

renderLineListPretty :: [Line] -> Render ()
renderLineListPretty :: [Line] -> Render ()
renderLineListPretty = [Char] -> ([Line] -> Render ()) -> [Line] -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"line list pretty" (([Line] -> Render ()) -> [Line] -> Render ())
-> ([Line] -> Render ()) -> [Line] -> Render ()
forall a b. (a -> b) -> a -> b
$
  [(Coord, Coord)] -> Render ()
renderCoordPairListPretty ([(Coord, Coord)] -> Render ())
-> ([Line] -> [(Coord, Coord)]) -> [Line] -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Line -> (Coord, Coord)) -> [Line] -> [(Coord, Coord)]
forall a b. (a -> b) -> [a] -> [b]
map Line -> (Coord, Coord)
lineToPair

renderMoveBracketed :: Maybe Coord -> Render ()
renderMoveBracketed :: Maybe Coord -> Render ()
renderMoveBracketed = [Char] -> (Maybe Coord -> Render ()) -> Maybe Coord -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"move bracketed" ((Maybe Coord -> Render ()) -> Maybe Coord -> Render ())
-> (Maybe Coord -> Render ()) -> Maybe Coord -> Render ()
forall a b. (a -> b) -> a -> b
$ Render () -> (Coord -> Render ()) -> Maybe Coord -> Render ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"[]") Coord -> Render ()
renderCoordBracketed

renderMovePretty :: Maybe Coord -> Render ()
renderMovePretty :: Maybe Coord -> Render ()
renderMovePretty = [Char] -> (Maybe Coord -> Render ()) -> Maybe Coord -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"move pretty" ((Maybe Coord -> Render ()) -> Maybe Coord -> Render ())
-> (Maybe Coord -> Render ()) -> Maybe Coord -> Render ()
forall a b. (a -> b) -> a -> b
$ Render () -> (Coord -> Render ()) -> Maybe Coord -> Render ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
"Pass") Coord -> Render ()
renderCoordPretty

renderNoneBracketed :: () -> Render ()
renderNoneBracketed :: () -> Render ()
renderNoneBracketed = [Char] -> (() -> Render ()) -> () -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"none bracketed" ((() -> Render ()) -> () -> Render ())
-> (() -> Render ()) -> () -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> (() -> [Char]) -> () -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> () -> [Char]
forall a b. a -> b -> a
const [Char]
"[]"

renderNonePretty :: () -> Render ()
renderNonePretty :: () -> Render ()
renderNonePretty = [Char] -> (() -> Render ()) -> () -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"none pretty" ((() -> Render ()) -> () -> Render ())
-> (() -> Render ()) -> () -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> (() -> [Char]) -> () -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> () -> [Char]
forall a b. a -> b -> a
const [Char]
""

renderRealBracketed :: RealValue -> Render ()
renderRealBracketed :: RealValue -> Render ()
renderRealBracketed =
  (Render () -> Render ())
-> (RealValue -> Render ()) -> RealValue -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed ((RealValue -> Render ()) -> RealValue -> Render ())
-> (RealValue -> Render ()) -> RealValue -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> (RealValue -> Render ()) -> RealValue -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"real" (RealValue -> Render ()
forall a. Show a => a -> Render ()
renderShowable :: BF.Bigfloat -> Render ())

renderRealPretty :: RealValue -> Render ()
renderRealPretty :: RealValue -> Render ()
renderRealPretty = [Char] -> (RealValue -> Render ()) -> RealValue -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"real pretty" (RealValue -> Render ()
forall a. Show a => a -> Render ()
renderShowable :: BF.Bigfloat -> Render ())

renderRulesetBracketed :: Ruleset -> Render ()
renderRulesetBracketed :: Ruleset -> Render ()
renderRulesetBracketed = (Render () -> Render ())
-> (Ruleset -> Render ()) -> Ruleset -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed ((Ruleset -> Render ()) -> Ruleset -> Render ())
-> (Ruleset -> Render ()) -> Ruleset -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> (Ruleset -> Render ()) -> Ruleset -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"ruleset" ((Ruleset -> Render ()) -> Ruleset -> Render ())
-> (Ruleset -> Render ()) -> Ruleset -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ())
-> (Ruleset -> [Char]) -> Ruleset -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ruleset -> [Char]
fromRuleset

renderRulesetPretty :: Ruleset -> Render ()
renderRulesetPretty :: Ruleset -> Render ()
renderRulesetPretty = [Char] -> (Ruleset -> Render ()) -> Ruleset -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"ruleset pretty" ((Ruleset -> Render ()) -> Ruleset -> Render ())
-> (Ruleset -> Render ()) -> Ruleset -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ())
-> (Ruleset -> [Char]) -> Ruleset -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ruleset -> [Char]
fromRuleset

renderSimpleTextPairBracketed :: (SimpleText, SimpleText) -> Render ()
renderSimpleTextPairBracketed :: (SimpleText, SimpleText) -> Render ()
renderSimpleTextPairBracketed = (Render () -> Render ())
-> ((SimpleText, SimpleText) -> Render ())
-> (SimpleText, SimpleText)
-> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed (((SimpleText, SimpleText) -> Render ())
 -> (SimpleText, SimpleText) -> Render ())
-> ((SimpleText, SimpleText) -> Render ())
-> (SimpleText, SimpleText)
-> Render ()
forall a b. (a -> b) -> a -> b
$ [Char]
-> ((SimpleText, SimpleText) -> Render ())
-> (SimpleText, SimpleText)
-> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"simple text pair" (((SimpleText, SimpleText) -> Render ())
 -> (SimpleText, SimpleText) -> Render ())
-> ((SimpleText, SimpleText) -> Render ())
-> (SimpleText, SimpleText)
-> Render ()
forall a b. (a -> b) -> a -> b
$ \(SimpleText
a, SimpleText
b) -> do
  Bool -> SimpleText -> Render ()
forall a. (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike Bool
True SimpleText
a
  [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
":"
  Bool -> SimpleText -> Render ()
forall a. (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike Bool
True SimpleText
b

renderSimpleTextPairPretty :: (SimpleText, SimpleText) -> Render ()
renderSimpleTextPairPretty :: (SimpleText, SimpleText) -> Render ()
renderSimpleTextPairPretty = [Char]
-> ((SimpleText, SimpleText) -> Render ())
-> (SimpleText, SimpleText)
-> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"simple text pair pretty" (((SimpleText, SimpleText) -> Render ())
 -> (SimpleText, SimpleText) -> Render ())
-> ((SimpleText, SimpleText) -> Render ())
-> (SimpleText, SimpleText)
-> Render ()
forall a b. (a -> b) -> a -> b
$ \(SimpleText
a, SimpleText
b) -> do
  Bool -> SimpleText -> Render ()
forall a. (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike Bool
True SimpleText
a
  [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [Char]
" "
  Bool -> SimpleText -> Render ()
forall a. (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike Bool
True SimpleText
b

renderSimpleTextBracketed :: SimpleText -> Render ()
renderSimpleTextBracketed :: SimpleText -> Render ()
renderSimpleTextBracketed = (Render () -> Render ())
-> (SimpleText -> Render ()) -> SimpleText -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed ((SimpleText -> Render ()) -> SimpleText -> Render ())
-> (SimpleText -> Render ()) -> SimpleText -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> (SimpleText -> Render ()) -> SimpleText -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"simple text" ((SimpleText -> Render ()) -> SimpleText -> Render ())
-> (SimpleText -> Render ()) -> SimpleText -> Render ()
forall a b. (a -> b) -> a -> b
$ Bool -> SimpleText -> Render ()
forall a. (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike Bool
False

renderSimpleTextPretty :: SimpleText -> Render ()
renderSimpleTextPretty :: SimpleText -> Render ()
renderSimpleTextPretty = [Char] -> (SimpleText -> Render ()) -> SimpleText -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"simple text pretty" ((SimpleText -> Render ()) -> SimpleText -> Render ())
-> (SimpleText -> Render ()) -> SimpleText -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ())
-> (SimpleText -> [Char]) -> SimpleText -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SimpleText -> [Char]
fromSimpleText

renderSizeBracketed :: (Int, Int) -> Render ()
renderSizeBracketed :: Coord -> Render ()
renderSizeBracketed = (Render () -> Render ())
-> (Coord -> Render ()) -> Coord -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed ((Coord -> Render ()) -> Coord -> Render ())
-> (Coord -> Render ()) -> Coord -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> (Coord -> Render ()) -> Coord -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"size" ((Coord -> Render ()) -> Coord -> Render ())
-> (Coord -> Render ()) -> Coord -> Render ()
forall a b. (a -> b) -> a -> b
$ \(Int
x, Int
y) -> do
  [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> [Char] -> Render ()
forall a b. (a -> b) -> a -> b
$ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
x
  Bool -> Render () -> Render ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
x Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
y) (Render () -> Render ()) -> Render () -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> [Char] -> Render ()
forall a b. (a -> b) -> a -> b
$ Char
':' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Int -> [Char]
forall a. Show a => a -> [Char]
show Int
y

renderSizePretty :: (Int, Int) -> Render ()
renderSizePretty :: Coord -> Render ()
renderSizePretty = [Char] -> (Coord -> Render ()) -> Coord -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"size pretty" Coord -> Render ()
renderCoordPretty

renderTextBracketed :: Text -> Render ()
renderTextBracketed :: Text -> Render ()
renderTextBracketed = (Render () -> Render ())
-> (Text -> Render ()) -> Text -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed ((Text -> Render ()) -> Text -> Render ())
-> (Text -> Render ()) -> Text -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> (Text -> Render ()) -> Text -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"text" ((Text -> Render ()) -> Text -> Render ())
-> (Text -> Render ()) -> Text -> Render ()
forall a b. (a -> b) -> a -> b
$ Bool -> Text -> Render ()
forall a. (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike Bool
False

renderTextPretty :: Text -> Render ()
renderTextPretty :: Text -> Render ()
renderTextPretty = [Char] -> (Text -> Render ()) -> Text -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"text pretty" ((Text -> Render ()) -> Text -> Render ())
-> (Text -> Render ()) -> Text -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> (Text -> [Char]) -> Text -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Char]
fromText

renderUnknownPropertyBracketed :: UnknownPropertyValue -> Render ()
renderUnknownPropertyBracketed :: UnknownPropertyValue -> Render ()
renderUnknownPropertyBracketed =
  (Render () -> Render ())
-> (UnknownPropertyValue -> Render ())
-> UnknownPropertyValue
-> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed ((UnknownPropertyValue -> Render ())
 -> UnknownPropertyValue -> Render ())
-> (UnknownPropertyValue -> Render ())
-> UnknownPropertyValue
-> Render ()
forall a b. (a -> b) -> a -> b
$ [Char]
-> (UnknownPropertyValue -> Render ())
-> UnknownPropertyValue
-> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"unknown property" ((UnknownPropertyValue -> Render ())
 -> UnknownPropertyValue -> Render ())
-> (UnknownPropertyValue -> Render ())
-> UnknownPropertyValue
-> Render ()
forall a b. (a -> b) -> a -> b
$ Bool -> UnknownPropertyValue -> Render ()
forall a. (Show a, Stringlike a) => Bool -> a -> Render ()
renderStringlike Bool
False

renderUnknownPropertyPretty :: UnknownPropertyValue -> Render ()
renderUnknownPropertyPretty :: UnknownPropertyValue -> Render ()
renderUnknownPropertyPretty =
  [Char]
-> (UnknownPropertyValue -> Render ())
-> UnknownPropertyValue
-> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"unknown property pretty" ((UnknownPropertyValue -> Render ())
 -> UnknownPropertyValue -> Render ())
-> (UnknownPropertyValue -> Render ())
-> UnknownPropertyValue
-> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ())
-> (UnknownPropertyValue -> [Char])
-> UnknownPropertyValue
-> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UnknownPropertyValue -> [Char]
fromUnknownPropertyValue

renderVariationModeBracketed :: VariationMode -> Render ()
renderVariationModeBracketed :: VariationMode -> Render ()
renderVariationModeBracketed =
  (Render () -> Render ())
-> (VariationMode -> Render ()) -> VariationMode -> Render ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Render () -> Render ()
bracketed ((VariationMode -> Render ()) -> VariationMode -> Render ())
-> (VariationMode -> Render ()) -> VariationMode -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char]
-> (VariationMode -> Render ()) -> VariationMode -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"variation mode" ((VariationMode -> Render ()) -> VariationMode -> Render ())
-> (VariationMode -> Render ()) -> VariationMode -> Render ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ())
-> (VariationMode -> [Char]) -> VariationMode -> Render ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Char]
forall a. Show a => a -> [Char]
show (Int -> [Char])
-> (VariationMode -> Int) -> VariationMode -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VariationMode -> Int
fromVariationMode

renderVariationModePretty :: VariationMode -> Render ()
renderVariationModePretty :: VariationMode -> Render ()
renderVariationModePretty = [Char]
-> (VariationMode -> Render ()) -> VariationMode -> Render ()
forall a. Show a => [Char] -> (a -> Render ()) -> a -> Render ()
rendererOf [Char]
"variation mode pretty" ((VariationMode -> Render ()) -> VariationMode -> Render ())
-> (VariationMode -> Render ()) -> VariationMode -> Render ()
forall a b. (a -> b) -> a -> b
$ \(VariationMode VariationModeSource
source Bool
markup) ->
  [Char] -> Render ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell ([Char] -> Render ()) -> [Char] -> Render ()
forall a b. (a -> b) -> a -> b
$
  (case VariationModeSource
source of
      VariationModeSource
ShowChildVariations -> [Char]
"Children"
      VariationModeSource
ShowCurrentVariations -> [Char]
"Current") [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
  (if Bool
markup then [Char]
"Shown" else [Char]
"Hidden")