on b6dbe1a help sign in
3 files changed+19−114
since splitsnapshots
unifiedsplit
Data/Syntax.hs+3−34 Data/Syntax/Combinator.hs+9−73 syntax.cabal+7−7
Data/Syntax.hs+3−34
@@ -30,8 +30,7 @@ import Control.Lens.SemiIso
3030import Control.SIArrow
3131import Data.MonoTraversable
3232import Data.Sequences hiding (take, takeWhile, replicate)
33−import qualified Data.Vector as V
34−import qualified Data.Vector.Unboxed as VU
33+import Data.Vector (Vector)
3534
3635-- | An isomorphism between a sequence and a list of its elements.
3736packed :: IsSequence seq => Iso' seq [Element seq]
@@ -106,7 +105,7 @@ class ( SIArrow syn
106105 -- @vecN n e@ describes a size @n@ vector with elements @e@.
107106 --
108107 -- Also see 'Data.Syntax.Combinator.vec'.
109− vecN :: Int -> syn () a -> syn () (V.Vector a)
108+ vecN :: Int -> syn () a -> syn () (Vector a)
110109 vecN n e = packed /$/ sireplicate n e
111110
112111 -- | Constant size vector with index-aware element. The default implementation
@@ -117,7 +116,7 @@ class ( SIArrow syn
117116 -- gets its index and should output a value and the index unchanged.
118117 --
119118 -- Also see 'Data.Syntax.Combinator.ivec'.
120− ivecN :: Int -> syn Int (Int, a) -> syn () (V.Vector a)
119+ ivecN :: Int -> syn Int (Int, a) -> syn () (Vector a)
121120 ivecN n e = (packed /$/)
122121 $ sisequence
123122 $ map (\(i, e') -> constant i ^>> e'
@@ -125,32 +124,6 @@ class ( SIArrow syn
125124 >># unit . swapped)
126125 $ zip [0 .. n-1] (replicate n e)
127126
128− -- | Constant size unboxed vector. The default implementation uses lists, but
129− -- "syntax-attoparsec" and "syntax-printer" override it with an efficient
130− -- implementation that works on a vector directly.
131− --
132− -- @vecN n e@ describes a size @n@ vector with elements @e@.
133− --
134− -- Also see 'Data.Syntax.Combinator.vec'.
135− uvecN :: VU.Unbox a => Int -> syn () a -> syn () (VU.Vector a)
136− uvecN n e = packed /$/ sireplicate n e
137−
138− -- | Constant size unboxed vector with index-aware element. The default implementation
139− -- uses lists, but "syntax-attoparsec" and "syntax-printer" override it with an
140− -- efficient implementation that works on a vector directly.
141− --
142− -- @ivecN n e@ describes a size @n@ vector with elements @e@. Each element
143− -- gets its index and should output a value and the index unchanged.
144− --
145− -- Also see 'Data.Syntax.Combinator.ivec'.
146− uivecN :: VU.Unbox a => Int -> syn Int (Int, a) -> syn () (VU.Vector a)
147− uivecN n e = (packed /$/)
148− $ sisequence
149− $ map (\(i, e') -> constant i ^>> e'
150− >>> first (sipure (constant i))
151− >># unit . swapped)
152− $ zip [0 .. n-1] (replicate n e)
153−
154127 {-# MINIMAL anyChar #-}
155128
156129instance Syntax syn => Syntax (ReaderCT env syn) where
@@ -166,10 +139,6 @@ instance Syntax syn => Syntax (ReaderCT env syn) where
166139 takeWhile1 = clift . takeWhile1
167140 takeTill = clift . takeTill
168141 takeTill1 = clift . takeTill1
169− vecN n e = ReaderCT $ vecN n . runReaderCT e
170− ivecN n e = ReaderCT $ ivecN n . runReaderCT e
171− uvecN n e = ReaderCT $ uvecN n . runReaderCT e
172− uivecN n e = ReaderCT $ uivecN n . runReaderCT e
173142
174143-- | Execute a computation in an isolated context.
175144--
Data/Syntax/Combinator.hs+9−73
@@ -26,24 +26,13 @@ module Data.Syntax.Combinator
2626 sepBy,
2727 sepBy1,
2828
29− -- * Arrowized combinators.
30− takeArr,
31−
3229 -- * Vectors.
3330 vecNSepBy,
3431 ivecNSepBy,
3532 vec,
3633 vecSepBy,
3734 ivec,
38− ivecSepBy,
39−
40− -- * Unboxed vectors.
41− uvecNSepBy,
42− uivecNSepBy,
43− uvec,
44− uvecSepBy,
45− uivec,
46− uivecSepBy
35+ ivecSepBy
4736 ) where
4837
4938import Control.Category
@@ -51,11 +40,10 @@ import Control.Category.Structures
5140import Control.Lens
5241import Control.Lens.SemiIso
5342import Control.SIArrow
54−import qualified Data.MonoTraversable as Seq
5543import Data.Syntax
44+import Data.Vector (Vector)
5645import qualified Data.Vector as V
57−import qualified Data.Vector.Unboxed as VU
58−import Prelude hiding (id, (.), take)
46+import Prelude hiding (id, (.))
5947
6048-- | One or zero occurences of @f@.
6149optional :: SIArrow cat => cat () a -> cat () (Maybe a)
@@ -93,22 +81,17 @@ sepBy v s = sepBy1 v s /+/ sipure _Empty
9381sepBy1 :: SIArrow cat => cat () a -> cat () () -> cat () [a]
9482sepBy1 v s = _Cons /$/ v /*/ (s */ sepBy1 v s /+/ sipure _Empty)
9583
96−-- | A string of given length.
97−takeArr :: Syntax syn => syn Int (Seq syn)
98−takeArr = sibind $ iso (\n -> constant n #>> take n)
99− (\s -> constant (Seq.olength s) #>> take (Seq.olength s))
100−
10184-- | Constant size vector with separators.
10285--
10386-- @vecNSepBy n e sep@ describes a size @n@ vector with elements @e@ separated by @sep@.
104−vecNSepBy :: Syntax syn => Int -> syn () a -> syn () () -> syn () (V.Vector a)
87+vecNSepBy :: Syntax syn => Int -> syn () a -> syn () () -> syn () (Vector a)
10588vecNSepBy n e sep = ivecNSepBy n (unit ^>> second e) sep
10689
10790-- | Constant size vector with separators and index-aware elements.
10891--
10992-- @ivecNSepBy n e sep@ describes a size @n@ vector with elements @e@ separated by @sep@.
11093-- Each element gets its index and should output a value and the index unchanged.
111−ivecNSepBy :: Syntax syn => Int -> syn Int (Int, a) -> syn () () -> syn () (V.Vector a)
94+ivecNSepBy :: Syntax syn => Int -> syn Int (Int, a) -> syn () () -> syn () (Vector a)
11295ivecNSepBy n e sep = ivecN n $ sibind $ iso el (el . fst)
11396 where
11497 el k | k < n - 1 = unit ^>> e *** sep >># unit
@@ -117,74 +100,27 @@ ivecNSepBy n e sep = ivecN n $ sibind $ iso el (el . fst)
117100-- | Runtime sized vector. The size can depend on the result of some computation.
118101--
119102-- @vec e@ describes a vector with elements @e@.
120−vec :: Syntax syn => syn () a -> syn Int (V.Vector a)
103+vec :: Syntax syn => syn () a -> syn Int (Vector a)
121104vec e = vecSepBy e (siarr id)
122105
123106-- | Runtime sized vector with separators. The size can depend on the result of some
124107-- computation.
125108--
126109-- @vecSepBy e sep@ describes a vector with elements @e@ separated by @sep@.
127−vecSepBy :: Syntax syn => syn () a -> syn () () -> syn Int (V.Vector a)
110+vecSepBy :: Syntax syn => syn () a -> syn () () -> syn Int (Vector a)
128111vecSepBy e sep = ivecSepBy (unit ^>> second e) sep
129112
130113-- | Runtime sized vector with index-aware elements. The size can depend on the result
131114-- of some computation.
132115--
133116-- @ivec e@ describes a vector with elements @e@.
134−ivec :: Syntax syn => syn Int (Int, a) -> syn Int (V.Vector a)
117+ivec :: Syntax syn => syn Int (Int, a) -> syn Int (Vector a)
135118ivec e = ivecSepBy e (siarr id)
136119
137120-- | Runtime sized vector with index-aware elements and separators. The size can depend
138121-- on the result of some computation.
139122--
140123-- @ivecSepBy e sep@ describes a vector with elements @e@ separated by @sep@.
141−ivecSepBy :: Syntax syn => syn Int (Int, a) -> syn () () -> syn Int (V.Vector a)
124+ivecSepBy :: Syntax syn => syn Int (Int, a) -> syn () () -> syn Int (Vector a)
142125ivecSepBy e sep = sibind $ iso (\n -> constant n #>> ivecNSepBy n e sep)
143126 (\v -> constant (V.length v) #>> ivecNSepBy (V.length v) e sep)
144−
145−-- | Constant size unboxed vector with separators.
146−--
147−-- @uvecNSepBy n e sep@ describes a size @n@ vector with elements @e@ separated by @sep@.
148−uvecNSepBy :: (Syntax syn, VU.Unbox a) => Int -> syn () a -> syn () () -> syn () (VU.Vector a)
149−uvecNSepBy n e sep = uivecNSepBy n (unit ^>> second e) sep
150−
151−-- | Constant size unboxed vector with separators and index-aware elements.
152−--
153−-- @uivecNSepBy n e sep@ describes a size @n@ vector with elements @e@ separated by @sep@.
154−-- Each element gets its index and should output a value and the index unchanged.
155−uivecNSepBy :: (Syntax syn, VU.Unbox a) => Int -> syn Int (Int, a)
156− -> syn () () -> syn () (VU.Vector a)
157−uivecNSepBy n e sep = uivecN n $ sibind $ iso el (el . fst)
158− where
159− el k | k < n - 1 = unit ^>> e *** sep >># unit
160− | otherwise = e
161−
162−-- | Runtime sized unboxed vector. The size can depend on the result of some computation.
163−--
164−-- @uvec e@ describes a vector with elements @e@.
165−uvec :: (Syntax syn, VU.Unbox a) => syn () a -> syn Int (VU.Vector a)
166−uvec e = uvecSepBy e (siarr id)
167−
168−-- | Runtime sized unboxed vector with separators. The size can depend on the result of some
169−-- computation.
170−--
171−-- @uvecSepBy e sep@ describes a vector with elements @e@ separated by @sep@.
172−uvecSepBy :: (Syntax syn, VU.Unbox a) => syn () a -> syn () () -> syn Int (VU.Vector a)
173−uvecSepBy e sep = uivecSepBy (unit ^>> second e) sep
174−
175−-- | Runtime sized unboxed vector with index-aware elements. The size can depend on the result
176−-- of some computation.
177−--
178−-- @uivec e@ describes a vector with elements @e@.
179−uivec :: (Syntax syn, VU.Unbox a) => syn Int (Int, a) -> syn Int (VU.Vector a)
180−uivec e = uivecSepBy e (siarr id)
181−
182−-- | Runtime sized unboxed vector with index-aware elements and separators. The size can depend
183−-- on the result of some computation.
184−--
185−-- @uivecSepBy e sep@ describes a vector with elements @e@ separated by @sep@.
186−uivecSepBy :: (Syntax syn, VU.Unbox a) => syn Int (Int, a)
187− -> syn () () -> syn Int (VU.Vector a)
188−uivecSepBy e sep = sibind $ iso (\n -> constant n #>> uivecNSepBy n e sep)
189− (\v -> constant (VU.length v)
190− #>> uivecNSepBy (VU.length v) e sep)
syntax.cabal+7−7
@@ -4,10 +4,9 @@ synopsis: Reversible parsing and pretty-printing.
44description:
55 "syntax" allows you to write a single syntax description and instantiate is both as a parser and a pretty printer.
66 .
7− Syntax descriptions are written in applicative or arrow style. The library uses a custom typeclass hierarchy, provided
8− by the "semi-iso" package. Most of the time you will be using operators like '/$/', '/*/' and '/+/' (= '<|>'), just
9− like parser combinators. When more power is needed - e.g. when the syntax depends on the parsed or printed value -
10− you turn to arrows.
7+ Syntax descriptions are written in applicative or arrow style. The library uses a custom hierarchy, provided by the
8+ "semi-iso" package. Most of the time you will be using operators like '/$/' and '/*/', just like parser combinators.
9+ When more power is needed - e.g. when the syntax depends on the parsed or printed value - you turn to arrows.
1110 .
1211 Semi-isomorphisms from "semi-iso" are the basic building block of syntax descriptions. I recommend reading
1312 the hackage page of "semi-iso" first, as it contains much more information.
@@ -20,10 +19,11 @@ description:
2019 Advanced formatting and parsing (for example indentation, haskell layout rule) is implemented as category transformers
2120 (similar to monad transformers). Currently only simple indentation is implemented (in "Data.Syntax.Indent") - basically
2221 a reader category transformer that tracks current indentation level. I plan on implementing Haskell layout rule in the
23− future.
22+ future (as a reusable transformer).
2423 .
25− The library can work with both text and binary data. Alas, there are no binary combinators implemented yet.
26− I will implement them when i have the time (but these category transformers look so much more interesting for now ;).
24+ Note that the library can work with both text and binary data. There are no binary combinators implemented - yet.
25+ Alas, these are not only useful combinators missing! I will slowly but steadily implement them over time
26+ (but these category transformers look so much more interesting for now ;).
2727 .
2828 EXAMPLES! See @syntax-example@ and @syntax-example-json@ for examples.
2929 .