packages feed

separated 0.1.1 → 0.1.2

raw patch · 3 files changed

+35/−25 lines, 3 files

Files

changelog view
@@ -1,3 +1,7 @@+0.1.2++* Add instance of `Wrapped` and `Swapped`.+ 0.1.1  * Introduce `separatedBy` and `separatedBy1` combinators.
separated.cabal view
@@ -1,5 +1,5 @@ name:               separated-version:            0.1.1+version:            0.1.2 license:            BSD3 license-File:       etc/LICENCE author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
src/Data/Separated/Separated.hs view
@@ -1,29 +1,34 @@ {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE FlexibleInstances #-}  module Data.Separated.Separated(   Separated , separated , Separated1 , separated1+-- * Viewing , separated1Head , separated1Tail+-- Constructing , empty , (+-) , single+-- * Appending , shift-, separatedSwap , (.++.) , (++.) , (.++)+-- * Alternating , separatedBy , separatedBy1 ) where  import Control.Applicative(Alternative(many))-import Data.Bifoldable-import Data.Bitraversable+import Data.Bifoldable(Bifoldable(bifoldr))+import Data.Bitraversable(Bitraversable(bitraverse)) import Data.Functor.Apply as Apply((<.>)) import Data.List(intercalate, zipWith, repeat) import Data.Monoid as Monoid(mappend)@@ -46,6 +51,26 @@   Separated [(a, b)]   deriving (Eq, Ord) +makeWrapped ''Separated++-- | The isomorphism that swaps elements with their separators.+--+-- >>> swapped # empty+-- []+--+-- >>> swapped # ('x' +: 6 +: empty)+-- [6,'x']+--+-- >>> empty ^. swapped+-- []+--+-- >>> ('x' +: 6 +: empty) ^. swapped+-- [6,'x']+instance Swapped Separated where+  swapped =+    let swap = (\(Separated x) -> Separated (fmap (\(a, b) -> (b, a)) x))+    in iso swap swap+ instance Bifunctor Separated where   bimap f g (Separated x) =     Separated (fmap (bimap f g) x)@@ -159,7 +184,7 @@   (<*>) =     separated1Ap (<>)   pure =-    Separated1 mempty . (separatedSwap #) . pure+    Separated1 mempty . (swapped #) . pure  instance SeparatedCons Separated Separated1 where   type SeparatedConsF Separated1 = Separated@@ -185,7 +210,7 @@ separated ::   Iso [(a, b)] [(c, d)] (Separated a b) (Separated c d) separated =-  iso Separated (\(Separated x) -> x)+  from _Wrapped  empty ::   Separated s a@@ -284,25 +309,6 @@         let (w, z) = shiftL (Separated1 t' (Separated r))         in ((s', a) : w, z)   in iso shiftL shiftR---- | The isomorphism that swaps elements with their separators.------ >>> separatedSwap # empty--- []------ >>> separatedSwap # ('x' +: 6 +: empty)--- [6,'x']------ >>> empty ^. separatedSwap--- []------ >>> ('x' +: 6 +: empty) ^. separatedSwap--- [6,'x']-separatedSwap ::-  Iso (Separated s a) (Separated t b) (Separated a s) (Separated b t)-separatedSwap =-  let swap (a, b) = (b, a)-  in iso (\(Separated x) -> Separated (fmap swap x)) (\(Separated x) -> Separated (fmap swap x))  -- | Append two lists of separated values to produce a list of pairs of separator and element values. --