improved the geolite city type

This commit is contained in:
Andrew Martin 2016-08-01 09:04:14 -04:00
parent 02d616a555
commit 573d1ee2f7
5 changed files with 115 additions and 12 deletions

View File

@ -105,6 +105,7 @@ instance Applicative (Decoding f content) where
DecodingPure f <*> y = fmap f y
DecodingAp h c y <*> z = DecodingAp h c (flip <$> y <*> z)
-- | Encodes a header and a cell.
data OneEncoding f content a = OneEncoding
{ oneEncodingHead :: !(f content)
, oneEncodingEncode :: !(a -> content)

View File

@ -33,6 +33,7 @@ decodingCity = City
<*> CD.headed "subdivision_1_name" CDT.text
<*> CD.headed "subdivision_2_iso_code" CDT.text
<*> CD.headed "subdivision_2_name" CDT.text
<*> CD.headed "city_name" CDT.text
<*> CD.headed "metro_code" (CDT.optional CDT.int)
<*> CD.headed "time_zone" CDT.text

View File

@ -23,6 +23,7 @@ data City = City
, citySubdivision1Name :: Text
, citySubdivision2IsoCode :: Text
, citySubdivision2Name :: Text
, cityName :: Text
, cityMetroCode :: Maybe Int
, cityTimeZone :: Text
} deriving (Show,Read,Eq,Ord)

View File

@ -0,0 +1,48 @@
#!/bin/bash
set -e
if [ "$#" -ne 1 ]; then
echo "Usage: scripts/hackage-docs.sh HACKAGE_USER"
exit 1
fi
user=$1
cabal_file=$(find . -maxdepth 1 -name "*.cabal" -print -quit)
if [ ! -f "$cabal_file" ]; then
echo "Run this script in the top-level package directory"
exit 1
fi
pkg=$(awk -F ":[[:space:]]*" 'tolower($1)=="name" { print $2 }' < "$cabal_file")
ver=$(awk -F ":[[:space:]]*" 'tolower($1)=="version" { print $2 }' < "$cabal_file")
if [ -z "$pkg" ]; then
echo "Unable to determine package name"
exit 1
fi
if [ -z "$ver" ]; then
echo "Unable to determine package version"
exit 1
fi
echo "Detected package: $pkg-$ver"
dir=$(mktemp -d build-docs.XXXXXX)
trap 'rm -r "$dir"' EXIT
# cabal haddock --hoogle --hyperlink-source --html-location='/package/$pkg-$version/docs' --contents-location='/package/$pkg-$version'
stack haddock
cp -R .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/doc/html/$pkg/ $dir/$pkg-$ver-docs
# /home/andrew/.stack/snapshots/x86_64-linux/lts-5.17/7.10.3/doc/index.html
tar cvz -C $dir --format=ustar -f $dir/$pkg-$ver-docs.tar.gz $pkg-$ver-docs
curl -X PUT \
-H 'Content-Type: application/x-tar' \
-H 'Content-Encoding: gzip' \
-u "$user" \
--data-binary "@$dir/$pkg-$ver-docs.tar.gz" \
"https://hackage.haskell.org/package/$pkg-$ver/docs"

View File

@ -1,6 +1,12 @@
{-# LANGUAGE DeriveFunctor #-}
module Reflex.Dom.Colonnade where
module Reflex.Dom.Colonnade
( Cell(..)
, cell
, basic
, dynamic
, dynamicEventful
) where
import Colonnade.Types
import Control.Monad
@ -17,14 +23,16 @@ import qualified Data.Map as Map
cell :: m b -> Cell m b
cell = Cell Map.empty
-- data NewCell b = NewCell
-- { newCellAttrs :: !(Map String String)
-- , newCellContents :: !b
-- } deriving (Functor)
data Cell m b = Cell
{ cellAttrs :: !(Map String String)
, cellContents :: !(m b)
} deriving (Functor)
-- instance Functor (Cell m) where
-- fmap f (a
basic :: (MonadWidget t m, Foldable f)
=> Map String String -- ^ Table element attributes
-> f a -- ^ Values
@ -50,16 +58,16 @@ dynamic :: (MonadWidget t m, Foldable f)
-> m ()
dynamic tableAttrs as encoding@(Encoding v) = do
elAttr "table" tableAttrs $ do
theadBuild encoding
el "tbody" $ forM_ as $ \a -> 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
_ <- elDynAttr "td" dynAttrs $ dyn dynContent
return ()
elDynAttr "td" dynAttrs $ dyn dynContent
return (mappend b1 b2)
dynamicEventful :: (MonadWidget t m, Traversable f, Semigroup e)
dynamicEventful :: (MonadWidget t m, Foldable 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
@ -67,13 +75,57 @@ dynamicEventful :: (MonadWidget t m, Traversable f, Semigroup 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
b2 <- el "tbody" $ flip foldMapM as $ \a -> do
el "tr" $ flip foldMapM 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))
return (mappend b1 b2)
foldMapM :: (Foldable t, Monoid b, Monad m) => (a -> m b) -> t a -> m b
foldMapM f = foldrM (\a b -> fmap (flip mappend b) (f a)) mempty
foldAlternativeM :: (Foldable t, Monoid b, Monad m) => (a -> m b) -> t a -> m b
foldAlternativeM f = foldrM (\a b -> fmap (flip mappend b) (f a)) mempty
-- dynamicEventfulWith :: (MonadWidget t m, Foldable f, Semigroup e, Monoid b)
-- => (e -> b)
-- -> 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)
-- dynamicEventfulWith f tableAttrs as encoding@(Encoding v) = do
-- elAttr "table" tableAttrs $ do
-- b1 <- theadBuild encoding
-- b2 <- el "tbody" $ flip foldMapM as $ \a -> do
-- el "tr" $ flip foldMapM v $ \(OneEncoding _ encode) -> do
-- dynPair <- mapDyn encode a
-- dynAttrs <- mapDyn cellAttrs dynPair
-- dynContent <- mapDyn cellContents dynPair
-- e <- elDynAttr "td" dynAttrs $ dyn dynContent
-- flattenedEvent <- switchPromptly never e
-- return (f flattenedEvent)
-- return (mappend b1 b2)
--
-- dynamicEventfulMany :: (MonadWidget t m, Foldable f, Alternative g)
-- => Map String String -- ^ Table element attributes
-- -> f (Dynamic t a) -- ^ Dynamic values
-- -> Encoding Headed (NewCell (g (Compose m (Event t)))) a -- ^ Encoding of a value into cells
-- -> m (g (Event t e))
-- dynamicEventfulMany tableAttrs as encoding@(Encoding v) = do
-- elAttr "table" tableAttrs $ do
-- -- b1 <- theadBuild encoding
-- b2 <- el "tbody" $ flip foldMapM as $ \a -> do
-- el "tr" $ flip foldMapM v $ \(OneEncoding _ encode) -> do
-- dynPair <- mapDyn encode a
-- dynAttrs <- mapDyn cellAttrs dynPair
-- dynContent <- mapDyn cellContents dynPair
-- e <- elDynAttr "td" dynAttrs $ dyn dynContent
-- switchPromptly never e
-- return (mappend b1 b2)
-- data Update f = UpdateName (f Text) | UpdateAge (f Int) | ...