diff --git a/Data/Syntax/Combinator.hs b/Data/Syntax/Combinator.hs new file mode 100644 index 0000000..120642f --- /dev/null +++ b/Data/Syntax/Combinator.hs @@ -0,0 +1,25 @@ +{- | +Module : Data.Syntax.Combinator +Description : Combinators that work with any sequence type. +Copyright : (c) Paweł Nowak +License : MIT + +Maintainer : Paweł Nowak +Stability : experimental + +Combinators that work with any sequence type. +-} +module Data.Syntax.Combinator where + +import Control.Lens.Cons +import Control.Lens.Empty +import Data.SemiIsoFunctor + +-- | Zero or more occurences of v separated by s. +sepBy :: SemiIsoAlternative f => f a -> f () -> f [a] +sepBy v s = sepBy1 v s + /|/ sipure _Empty + +-- | One or more occurences of v separated by s. +sepBy1 :: SemiIsoAlternative f => f a -> f () -> f [a] +sepBy1 v s = _Cons /$/ v /*/ (s */ sepBy1 v s /|/ sipure _Empty) diff --git a/syntax.cabal b/syntax.cabal index b5cb820..dab0aed 100644 --- a/syntax.cabal +++ b/syntax.cabal @@ -1,5 +1,5 @@ name: syntax -version: 0.1.0.0 +version: 0.1.1.0 synopsis: Abstract syntax descriptions for parsing and pretty-printing. description: Write single syntax description, get both parser and pretty-printer. . @@ -24,5 +24,6 @@ source-repository head library exposed-modules: Data.Syntax Data.Syntax.Char + Data.Syntax.Combinator build-depends: base >= 4 && < 5, mono-traversable, lens, semi-iso default-language: Haskell2010