more changes

This commit is contained in:
Andrew Martin 2016-07-06 08:53:44 -04:00
parent 3ae2f973d4
commit c7d0fe4d27
4 changed files with 41 additions and 20 deletions

View File

@ -1,5 +1,5 @@
name: colonnade name: colonnade
version: 0.1 version: 0.3
synopsis: Generic types and functions for columnar encoding and decoding synopsis: Generic types and functions for columnar encoding and decoding
description: Please see README.md description: Please see README.md
homepage: https://github.com/andrewthad/colonnade#readme homepage: https://github.com/andrewthad/colonnade#readme

View File

@ -24,24 +24,24 @@ runRow :: (c1 -> c2) -> Encoding f c1 a -> a -> Vector c2
runRow g (Encoding v) a = flip Vector.map v $ runRow g (Encoding v) a = flip Vector.map v $
\(OneEncoding _ encode) -> g (encode a) \(OneEncoding _ encode) -> g (encode a)
runRowMonadic :: Monad m runRowMonadic :: (Monad m, Monoid b)
=> Encoding f content a => Encoding f content a
-> (content -> m ()) -> (content -> m b)
-> a -> a
-> m () -> m b
runRowMonadic (Encoding v) g a = Vector.forM_ v $ \e -> runRowMonadic (Encoding v) g a = fmap (mconcat . Vector.toList) $ Vector.forM v $ \e ->
g (oneEncodingEncode e a) g (oneEncodingEncode e a)
runHeader :: (c1 -> c2) -> Encoding Headed c1 a -> Vector c2 runHeader :: (c1 -> c2) -> Encoding Headed c1 a -> Vector c2
runHeader g (Encoding v) = runHeader g (Encoding v) =
Vector.map (g . getHeaded . oneEncodingHead) v Vector.map (g . getHeaded . oneEncodingHead) v
runHeaderMonadic :: Monad m runHeaderMonadic :: (Monad m, Monoid b)
=> Encoding Headed content a => Encoding Headed content a
-> (content -> m ()) -> (content -> m b)
-> m () -> m b
runHeaderMonadic (Encoding v) g = runHeaderMonadic (Encoding v) g =
Vector.mapM_ (g . getHeaded . oneEncodingHead) v fmap (mconcat . Vector.toList) $ Vector.mapM (g . getHeaded . oneEncodingHead) v

View File

@ -1,5 +1,5 @@
name: reflex-dom-colonnade name: reflex-dom-colonnade
version: 0.2 version: 0.3
synopsis: Use colonnade with reflex-dom synopsis: Use colonnade with reflex-dom
description: Please see README.md description: Please see README.md
homepage: https://github.com/andrewthad/colonnade#readme homepage: https://github.com/andrewthad/colonnade#readme
@ -18,12 +18,13 @@ library
Reflex.Dom.Colonnade Reflex.Dom.Colonnade
build-depends: build-depends:
base >= 4.7 && < 5 base >= 4.7 && < 5
, colonnade , colonnade >= 0.3
, contravariant , contravariant
, vector , vector
, reflex , reflex
, reflex-dom , reflex-dom
, containers , containers
, semigroups
default-language: Haskell2010 default-language: Haskell2010
ghc-options: -Wall ghc-options: -Wall

View File

@ -2,26 +2,28 @@ module Reflex.Dom.Colonnade where
import Colonnade.Types import Colonnade.Types
import Control.Monad import Control.Monad
import Reflex (Dynamic) import Data.Foldable
import Reflex (Dynamic,Event,switchPromptly,never)
import Reflex.Dynamic (mapDyn) import Reflex.Dynamic (mapDyn)
import Reflex.Dom (MonadWidget) import Reflex.Dom (MonadWidget)
import Reflex.Dom.Widget.Basic import Reflex.Dom.Widget.Basic
import Data.Map (Map) import Data.Map (Map)
import Data.Semigroup (Semigroup)
import qualified Colonnade.Encoding as Encoding import qualified Colonnade.Encoding as Encoding
import qualified Data.Map as Map import qualified Data.Map as Map
cell :: m () -> Cell m cell :: m b -> Cell m b
cell = Cell Map.empty cell = Cell Map.empty
data Cell m = Cell data Cell m b = Cell
{ cellAttrs :: Map String String { cellAttrs :: !(Map String String)
, cellContents :: m () , cellContents :: !(m b)
} }
basic :: (MonadWidget t m, Foldable f) basic :: (MonadWidget t m, Foldable f)
=> Map String String -- ^ Table element attributes => Map String String -- ^ Table element attributes
-> f a -- ^ Values -> f a -- ^ Values
-> Encoding Headed (Cell m) a -- ^ Encoding of a value into cells -> Encoding Headed (Cell m ()) a -- ^ Encoding of a value into cells
-> m () -> m ()
basic tableAttrs as encoding = do basic tableAttrs as encoding = do
elAttr "table" tableAttrs $ do elAttr "table" tableAttrs $ do
@ -29,17 +31,17 @@ basic tableAttrs as encoding = do
el "tbody" $ forM_ as $ \a -> do el "tbody" $ forM_ as $ \a -> do
el "tr" $ mapM_ (Encoding.runRowMonadic encoding (elFromCell "td")) as el "tr" $ mapM_ (Encoding.runRowMonadic encoding (elFromCell "td")) as
elFromCell :: MonadWidget t m => String -> Cell m -> m () elFromCell :: MonadWidget t m => String -> Cell m b -> m b
elFromCell name (Cell attrs contents) = elAttr name attrs contents elFromCell name (Cell attrs contents) = elAttr name attrs contents
theadBuild :: MonadWidget t m => Encoding Headed (Cell m) a -> m () theadBuild :: (MonadWidget t m, Monoid b) => Encoding Headed (Cell m b) a -> m b
theadBuild encoding = el "thead" . el "tr" theadBuild encoding = el "thead" . el "tr"
$ Encoding.runHeaderMonadic encoding (elFromCell "th") $ Encoding.runHeaderMonadic encoding (elFromCell "th")
dynamic :: (MonadWidget t m, Foldable f) dynamic :: (MonadWidget t m, Foldable f)
=> Map String String -- ^ Table element attributes => Map String String -- ^ Table element attributes
-> f (Dynamic t a) -- ^ Dynamic values -> f (Dynamic t a) -- ^ Dynamic values
-> Encoding Headed (Cell m) a -- ^ Encoding of a value into cells -> Encoding Headed (Cell m ()) a -- ^ Encoding of a value into cells
-> m () -> m ()
dynamic tableAttrs as encoding@(Encoding v) = do dynamic tableAttrs as encoding@(Encoding v) = do
elAttr "table" tableAttrs $ do elAttr "table" tableAttrs $ do
@ -52,3 +54,21 @@ dynamic tableAttrs as encoding@(Encoding v) = do
_ <- elDynAttr "td" dynAttrs $ dyn dynContent _ <- elDynAttr "td" dynAttrs $ dyn dynContent
return () return ()
dynamicEventful :: (MonadWidget t m, Traversable f, Semigroup e)
=> Map String String -- ^ Table element attributes
-> f (Dynamic t a) -- ^ Dynamic values
-> Encoding Headed (Cell m (Event t e)) a -- ^ Encoding of a value into cells
-> m (Event t e)
dynamicEventful tableAttrs as encoding@(Encoding v) = do
elAttr "table" tableAttrs $ do
b1 <- theadBuild encoding
b2 <- el "tbody" $ forM as $ \a -> do
el "tr" $ forM v $ \(OneEncoding _ encode) -> do
dynPair <- mapDyn encode a
dynAttrs <- mapDyn cellAttrs dynPair
dynContent <- mapDyn cellContents dynPair
e <- elDynAttr "td" dynAttrs $ dyn dynContent
-- TODO: This might actually be wrong. Revisit this.
switchPromptly never e
return (mappend b1 (mconcat $ toList $ mconcat $ toList b2))