diff options
-rw-r--r-- | spec/src/Thermoprint/Printout.hs | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/spec/src/Thermoprint/Printout.hs b/spec/src/Thermoprint/Printout.hs index 89be802..aae71aa 100644 --- a/spec/src/Thermoprint/Printout.hs +++ b/spec/src/Thermoprint/Printout.hs | |||
@@ -52,6 +52,7 @@ import Data.Monoid (Monoid(..), (<>)) | |||
52 | import Data.List (dropWhile, dropWhileEnd, groupBy, genericLength, genericReplicate) | 52 | import Data.List (dropWhile, dropWhileEnd, groupBy, genericLength, genericReplicate) |
53 | 53 | ||
54 | import Data.Sequence as Seq (fromList, null, singleton) | 54 | import Data.Sequence as Seq (fromList, null, singleton) |
55 | import Data.Sequence (ViewL(..), viewl) | ||
55 | 56 | ||
56 | import Data.Function (on) | 57 | import Data.Function (on) |
57 | 58 | ||
@@ -80,6 +81,18 @@ instance PersistFieldSql Printout where | |||
80 | -- | A 'Paragraph' is a non-seperated sequence of 'Chunk's | 81 | -- | A 'Paragraph' is a non-seperated sequence of 'Chunk's |
81 | type Paragraph = Seq Chunk | 82 | type Paragraph = Seq Chunk |
82 | 83 | ||
84 | instance FromJSON Paragraph where | ||
85 | parseJSON o@(Array _) = Seq.fromList <$> parseJSON o | ||
86 | parseJSON o@(Object _) = Seq.singleton <$> parseJSON o | ||
87 | parseJSON o@(String _) = Seq.singleton <$> parseJSON o | ||
88 | parseJSON v = typeMismatch "Paragraph" v | ||
89 | |||
90 | instance ToJSON Paragraph where | ||
91 | toJSON cs | ||
92 | | (a :< as) <- viewl cs | ||
93 | , Seq.null as = toJSON a | ||
94 | | otherwise = toJSON $ toList cs | ||
95 | |||
83 | -- | We introduce both 'Chunk' and 'Paragraph' mainly to allow 'Raw'. | 96 | -- | We introduce both 'Chunk' and 'Paragraph' mainly to allow 'Raw'. |
84 | -- | 97 | -- |
85 | -- Were we to disallow 'Raw', 'Block' would be identical to 'Paragraph' | 98 | -- Were we to disallow 'Raw', 'Block' would be identical to 'Paragraph' |