{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiWayIf        #-}
{-# LANGUAGE CPP               #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE StandaloneDeriving     #-}

module Data.GeoIP2.Fields where

#if !MIN_VERSION_base(4,8,0)
import           Control.Applicative  ((<$>))
#endif

import           Control.Monad        (replicateM)
import           Data.Serialize
import           Data.Bits            (shift, (.&.))
import qualified Data.ByteString      as BS
import           Data.Int
import qualified Data.Map             as Map
import           Data.ReinterpretCast (wordToDouble)
import qualified Data.Text            as T
import           Data.Text.Encoding   (decodeUtf8)
import           Data.Word
import           Data.Void
import           Control.Lens.TH      (makePrisms)

data GeoFieldT a =
    DataPointer a
  | DataString !T.Text
  | DataDouble Double
  | DataInt Int64
  | DataWord Word64
  | DataMap (Map.Map (GeoFieldT a) (GeoFieldT a))
  | DataArray [GeoFieldT a]
  | DataBool Bool
  | DataUnknown Word8 Int64
  deriving (GeoFieldT a -> GeoFieldT a -> Bool
(GeoFieldT a -> GeoFieldT a -> Bool)
-> (GeoFieldT a -> GeoFieldT a -> Bool) -> Eq (GeoFieldT a)
forall a. Eq a => GeoFieldT a -> GeoFieldT a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GeoFieldT a -> GeoFieldT a -> Bool
$c/= :: forall a. Eq a => GeoFieldT a -> GeoFieldT a -> Bool
== :: GeoFieldT a -> GeoFieldT a -> Bool
$c== :: forall a. Eq a => GeoFieldT a -> GeoFieldT a -> Bool
Eq, Eq (GeoFieldT a)
Eq (GeoFieldT a)
-> (GeoFieldT a -> GeoFieldT a -> Ordering)
-> (GeoFieldT a -> GeoFieldT a -> Bool)
-> (GeoFieldT a -> GeoFieldT a -> Bool)
-> (GeoFieldT a -> GeoFieldT a -> Bool)
-> (GeoFieldT a -> GeoFieldT a -> Bool)
-> (GeoFieldT a -> GeoFieldT a -> GeoFieldT a)
-> (GeoFieldT a -> GeoFieldT a -> GeoFieldT a)
-> Ord (GeoFieldT a)
GeoFieldT a -> GeoFieldT a -> Bool
GeoFieldT a -> GeoFieldT a -> Ordering
GeoFieldT a -> GeoFieldT a -> GeoFieldT a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (GeoFieldT a)
forall a. Ord a => GeoFieldT a -> GeoFieldT a -> Bool
forall a. Ord a => GeoFieldT a -> GeoFieldT a -> Ordering
forall a. Ord a => GeoFieldT a -> GeoFieldT a -> GeoFieldT a
min :: GeoFieldT a -> GeoFieldT a -> GeoFieldT a
$cmin :: forall a. Ord a => GeoFieldT a -> GeoFieldT a -> GeoFieldT a
max :: GeoFieldT a -> GeoFieldT a -> GeoFieldT a
$cmax :: forall a. Ord a => GeoFieldT a -> GeoFieldT a -> GeoFieldT a
>= :: GeoFieldT a -> GeoFieldT a -> Bool
$c>= :: forall a. Ord a => GeoFieldT a -> GeoFieldT a -> Bool
> :: GeoFieldT a -> GeoFieldT a -> Bool
$c> :: forall a. Ord a => GeoFieldT a -> GeoFieldT a -> Bool
<= :: GeoFieldT a -> GeoFieldT a -> Bool
$c<= :: forall a. Ord a => GeoFieldT a -> GeoFieldT a -> Bool
< :: GeoFieldT a -> GeoFieldT a -> Bool
$c< :: forall a. Ord a => GeoFieldT a -> GeoFieldT a -> Bool
compare :: GeoFieldT a -> GeoFieldT a -> Ordering
$ccompare :: forall a. Ord a => GeoFieldT a -> GeoFieldT a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (GeoFieldT a)
Ord)
-- Field with pointers resolved
type GeoField = GeoFieldT Void
deriving instance Show GeoField
-- Raw field with pointers
type GeoFieldRaw = GeoFieldT Int64

makePrisms ''GeoFieldT

-- | Go through the pointers and try to resolve them; we won't define instance of Applicative given that the 'key' to the Map is parametrized
traversePtr :: (Ord a, Applicative m) => (Int64 -> m (GeoFieldT a)) -> GeoFieldRaw -> m (GeoFieldT a)
traversePtr :: (Int64 -> m (GeoFieldT a)) -> GeoFieldRaw -> m (GeoFieldT a)
traversePtr Int64 -> m (GeoFieldT a)
_ (DataString Text
t) = GeoFieldT a -> m (GeoFieldT a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> GeoFieldT a
forall a. Text -> GeoFieldT a
DataString Text
t)
traversePtr Int64 -> m (GeoFieldT a)
_ (DataDouble Double
t) = GeoFieldT a -> m (GeoFieldT a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Double -> GeoFieldT a
forall a. Double -> GeoFieldT a
DataDouble Double
t)
traversePtr Int64 -> m (GeoFieldT a)
_ (DataInt Int64
t) = GeoFieldT a -> m (GeoFieldT a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int64 -> GeoFieldT a
forall a. Int64 -> GeoFieldT a
DataInt Int64
t)
traversePtr Int64 -> m (GeoFieldT a)
_ (DataWord Word64
t) = GeoFieldT a -> m (GeoFieldT a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Word64 -> GeoFieldT a
forall a. Word64 -> GeoFieldT a
DataWord Word64
t)
traversePtr Int64 -> m (GeoFieldT a)
_ (DataBool Bool
t) = GeoFieldT a -> m (GeoFieldT a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> GeoFieldT a
forall a. Bool -> GeoFieldT a
DataBool Bool
t)
traversePtr Int64 -> m (GeoFieldT a)
_ (DataUnknown Word8
a Int64
b) = GeoFieldT a -> m (GeoFieldT a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Word8 -> Int64 -> GeoFieldT a
forall a. Word8 -> Int64 -> GeoFieldT a
DataUnknown Word8
a Int64
b)
-- For map we have to traverse over both keys and values...
traversePtr Int64 -> m (GeoFieldT a)
f (DataMap Map GeoFieldRaw GeoFieldRaw
dmap) = Map (GeoFieldT a) (GeoFieldT a) -> GeoFieldT a
forall a. Map (GeoFieldT a) (GeoFieldT a) -> GeoFieldT a
DataMap (Map (GeoFieldT a) (GeoFieldT a) -> GeoFieldT a)
-> ([(GeoFieldT a, GeoFieldT a)]
    -> Map (GeoFieldT a) (GeoFieldT a))
-> [(GeoFieldT a, GeoFieldT a)]
-> GeoFieldT a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(GeoFieldT a, GeoFieldT a)] -> Map (GeoFieldT a) (GeoFieldT a)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(GeoFieldT a, GeoFieldT a)] -> GeoFieldT a)
-> m [(GeoFieldT a, GeoFieldT a)] -> m (GeoFieldT a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((GeoFieldRaw, GeoFieldRaw) -> m (GeoFieldT a, GeoFieldT a))
-> [(GeoFieldRaw, GeoFieldRaw)] -> m [(GeoFieldT a, GeoFieldT a)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (GeoFieldRaw, GeoFieldRaw) -> m (GeoFieldT a, GeoFieldT a)
travBoth (Map GeoFieldRaw GeoFieldRaw -> [(GeoFieldRaw, GeoFieldRaw)]
forall k a. Map k a -> [(k, a)]
Map.toList Map GeoFieldRaw GeoFieldRaw
dmap)
  where
    travBoth :: (GeoFieldRaw, GeoFieldRaw) -> m (GeoFieldT a, GeoFieldT a)
travBoth (GeoFieldRaw
key, GeoFieldRaw
val) = (,) (GeoFieldT a -> GeoFieldT a -> (GeoFieldT a, GeoFieldT a))
-> m (GeoFieldT a) -> m (GeoFieldT a -> (GeoFieldT a, GeoFieldT a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int64 -> m (GeoFieldT a)) -> GeoFieldRaw -> m (GeoFieldT a)
forall a (m :: * -> *).
(Ord a, Applicative m) =>
(Int64 -> m (GeoFieldT a)) -> GeoFieldRaw -> m (GeoFieldT a)
traversePtr Int64 -> m (GeoFieldT a)
f GeoFieldRaw
key m (GeoFieldT a -> (GeoFieldT a, GeoFieldT a))
-> m (GeoFieldT a) -> m (GeoFieldT a, GeoFieldT a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Int64 -> m (GeoFieldT a)) -> GeoFieldRaw -> m (GeoFieldT a)
forall a (m :: * -> *).
(Ord a, Applicative m) =>
(Int64 -> m (GeoFieldT a)) -> GeoFieldRaw -> m (GeoFieldT a)
traversePtr Int64 -> m (GeoFieldT a)
f GeoFieldRaw
val
traversePtr Int64 -> m (GeoFieldT a)
f (DataArray [GeoFieldRaw]
darr) = [GeoFieldT a] -> GeoFieldT a
forall a. [GeoFieldT a] -> GeoFieldT a
DataArray ([GeoFieldT a] -> GeoFieldT a)
-> m [GeoFieldT a] -> m (GeoFieldT a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (GeoFieldRaw -> m (GeoFieldT a))
-> [GeoFieldRaw] -> m [GeoFieldT a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((Int64 -> m (GeoFieldT a)) -> GeoFieldRaw -> m (GeoFieldT a)
forall a (m :: * -> *).
(Ord a, Applicative m) =>
(Int64 -> m (GeoFieldT a)) -> GeoFieldRaw -> m (GeoFieldT a)
traversePtr Int64 -> m (GeoFieldT a)
f) [GeoFieldRaw]
darr
traversePtr Int64 -> m (GeoFieldT a)
f (DataPointer Int64
a) = Int64 -> m (GeoFieldT a)
f Int64
a

-- | Parse number of given length
parseNumber :: Num a => Int64 -> Get a
parseNumber :: Int64 -> Get a
parseNumber Int64
fsize = do
  ByteString
bytes <- Int -> Get ByteString
getBytes (Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
fsize)
  a -> Get a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Get a) -> a -> Get a
forall a b. (a -> b) -> a -> b
$ (a -> Word8 -> a) -> a -> ByteString -> a
forall a. (a -> Word8 -> a) -> a -> ByteString -> a
BS.foldl' (\a
acc Word8
new -> Word8 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
new a -> a -> a
forall a. Num a => a -> a -> a
+ a
256 a -> a -> a
forall a. Num a => a -> a -> a
* a
acc) a
0 ByteString
bytes

instance Serialize GeoField where
  put :: Putter GeoField
put = String -> Putter GeoField
forall a. HasCallStack => String -> a
error String
"Serialization not implemented"
  get :: Get GeoField
get = do
    GeoFieldRaw
field <- Get GeoFieldRaw
forall t. Serialize t => Get t
get
    (Int64 -> Get GeoField) -> GeoFieldRaw -> Get GeoField
forall a (m :: * -> *).
(Ord a, Applicative m) =>
(Int64 -> m (GeoFieldT a)) -> GeoFieldRaw -> m (GeoFieldT a)
traversePtr (\Int64
_ -> String -> Get GeoField
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Pointer not accepted at this position") GeoFieldRaw
field

instance Serialize GeoFieldRaw where
  put :: Putter GeoFieldRaw
put = String -> Putter GeoFieldRaw
forall a. HasCallStack => String -> a
error String
"Serialization not implemented"
  get :: Get GeoFieldRaw
get = do
    Word8
control <- Get Word8
getWord8
    Word8
ftype <-  if | Word8
control Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. Word8
0xe0 Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
0 -> (Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
+Word8
7) (Word8 -> Word8) -> Get Word8 -> Get Word8
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word8
getWord8
                 | Bool
otherwise -> Word8 -> Get Word8
forall (m :: * -> *) a. Monad m => a -> m a
return (Word8 -> Get Word8) -> Word8 -> Get Word8
forall a b. (a -> b) -> a -> b
$ Word8
control Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shift` (-Int
5)
    let _fsize :: Int64
_fsize = Word8 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> Int64) -> Word8 -> Int64
forall a b. (a -> b) -> a -> b
$ Word8
control Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. Word8
0x1f :: Int64
    Int64
fsize <- if
            | Word8
ftype Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
1 -> do
                  let _ss :: Int64
_ss = Int64
_fsize Int64 -> Int -> Int64
forall a. Bits a => a -> Int -> a
`shift` (-Int
3)
                      _vval :: Int64
_vval = Int64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64 -> Int64) -> Int64 -> Int64
forall a b. (a -> b) -> a -> b
$ Int64
_fsize Int64 -> Int64 -> Int64
forall a. Bits a => a -> a -> a
.&. Int64
0x7
                  case Int64
_ss of
                    Int64
0 -> ((Int64
_vval Int64 -> Int -> Int64
forall a. Bits a => a -> Int -> a
`shift` Int
8) Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+) (Int64 -> Int64) -> Get Int64 -> Get Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Int64
forall a. Num a => Int64 -> Get a
parseNumber Int64
1
                    Int64
1 -> ((Int64
2048 Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+ (Int64
_vval Int64 -> Int -> Int64
forall a. Bits a => a -> Int -> a
`shift` Int
16)) Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+) (Int64 -> Int64) -> Get Int64 -> Get Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Int64
forall a. Num a => Int64 -> Get a
parseNumber Int64
2
                    Int64
2 -> ((Int64
526336 Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+ (Int64
_vval Int64 -> Int -> Int64
forall a. Bits a => a -> Int -> a
`shift` Int
24)) Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+) (Int64 -> Int64) -> Get Int64 -> Get Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Int64
forall a. Num a => Int64 -> Get a
parseNumber Int64
3
                    Int64
3 -> Int64 -> Get Int64
forall a. Num a => Int64 -> Get a
parseNumber Int64
4
                    Int64
_ -> String -> Get Int64
forall a. HasCallStack => String -> a
error String
"Cannot happen"
            | Int64
_fsize Int64 -> Int64 -> Bool
forall a. Ord a => a -> a -> Bool
< Int64
29  -> Int64 -> Get Int64
forall (m :: * -> *) a. Monad m => a -> m a
return Int64
_fsize
            | Int64
_fsize Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== Int64
29 -> (Int64
29Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+) (Int64 -> Int64) -> Get Int64 -> Get Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Int64
forall a. Num a => Int64 -> Get a
parseNumber Int64
1
            | Int64
_fsize Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== Int64
30 -> (Int64
285Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+) (Int64 -> Int64) -> Get Int64 -> Get Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Int64
forall a. Num a => Int64 -> Get a
parseNumber Int64
2
            | Int64
_fsize Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== Int64
31 ->  (Int64
65821Int64 -> Int64 -> Int64
forall a. Num a => a -> a -> a
+) (Int64 -> Int64) -> Get Int64 -> Get Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Int64
forall a. Num a => Int64 -> Get a
parseNumber Int64
3
            | Bool
otherwise -> String -> Get Int64
forall a. HasCallStack => String -> a
error String
"Shouldn't happen, limited to 5 bits"

    case Word8
ftype of
        Word8
1 -> GeoFieldRaw -> Get GeoFieldRaw
forall (m :: * -> *) a. Monad m => a -> m a
return (GeoFieldRaw -> Get GeoFieldRaw) -> GeoFieldRaw -> Get GeoFieldRaw
forall a b. (a -> b) -> a -> b
$ Int64 -> GeoFieldRaw
forall a. a -> GeoFieldT a
DataPointer Int64
fsize
        Word8
2 -> Text -> GeoFieldRaw
forall a. Text -> GeoFieldT a
DataString (Text -> GeoFieldRaw)
-> (ByteString -> Text) -> ByteString -> GeoFieldRaw
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
decodeUtf8 (ByteString -> GeoFieldRaw) -> Get ByteString -> Get GeoFieldRaw
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Get ByteString
getBytes (Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
fsize)
        Word8
3 -> Double -> GeoFieldRaw
forall a. Double -> GeoFieldT a
DataDouble (Double -> GeoFieldRaw)
-> (Word64 -> Double) -> Word64 -> GeoFieldRaw
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> Double
wordToDouble (Word64 -> GeoFieldRaw) -> Get Word64 -> Get GeoFieldRaw
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word64
forall t. Serialize t => Get t
get
        Word8
5 -> Word64 -> GeoFieldRaw
forall a. Word64 -> GeoFieldT a
DataWord (Word64 -> GeoFieldRaw) -> Get Word64 -> Get GeoFieldRaw
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Word64
forall a. Num a => Int64 -> Get a
parseNumber Int64
fsize
        Word8
6 -> Word64 -> GeoFieldRaw
forall a. Word64 -> GeoFieldT a
DataWord (Word64 -> GeoFieldRaw) -> Get Word64 -> Get GeoFieldRaw
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Word64
forall a. Num a => Int64 -> Get a
parseNumber Int64
fsize
        Word8
7 -> do
            [(GeoFieldRaw, GeoFieldRaw)]
pairs <- Int
-> Get (GeoFieldRaw, GeoFieldRaw)
-> Get [(GeoFieldRaw, GeoFieldRaw)]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM (Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
fsize) (Get (GeoFieldRaw, GeoFieldRaw)
 -> Get [(GeoFieldRaw, GeoFieldRaw)])
-> Get (GeoFieldRaw, GeoFieldRaw)
-> Get [(GeoFieldRaw, GeoFieldRaw)]
forall a b. (a -> b) -> a -> b
$ do
                    GeoFieldRaw
key <- Get GeoFieldRaw
forall t. Serialize t => Get t
get
                    GeoFieldRaw
val <- Get GeoFieldRaw
forall t. Serialize t => Get t
get
                    (GeoFieldRaw, GeoFieldRaw) -> Get (GeoFieldRaw, GeoFieldRaw)
forall (m :: * -> *) a. Monad m => a -> m a
return (GeoFieldRaw
key, GeoFieldRaw
val)
            GeoFieldRaw -> Get GeoFieldRaw
forall (m :: * -> *) a. Monad m => a -> m a
return (GeoFieldRaw -> Get GeoFieldRaw) -> GeoFieldRaw -> Get GeoFieldRaw
forall a b. (a -> b) -> a -> b
$ Map GeoFieldRaw GeoFieldRaw -> GeoFieldRaw
forall a. Map (GeoFieldT a) (GeoFieldT a) -> GeoFieldT a
DataMap ([(GeoFieldRaw, GeoFieldRaw)] -> Map GeoFieldRaw GeoFieldRaw
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(GeoFieldRaw, GeoFieldRaw)]
pairs)
        Word8
8 -> Word64 -> GeoFieldRaw
forall a. Word64 -> GeoFieldT a
DataWord (Word64 -> GeoFieldRaw) -> Get Word64 -> Get GeoFieldRaw
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Word64
forall a. Num a => Int64 -> Get a
parseNumber Int64
fsize
        Word8
9 -> Word64 -> GeoFieldRaw
forall a. Word64 -> GeoFieldT a
DataWord (Word64 -> GeoFieldRaw) -> Get Word64 -> Get GeoFieldRaw
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Get Word64
forall a. Num a => Int64 -> Get a
parseNumber Int64
fsize
        Word8
11 -> [GeoFieldRaw] -> GeoFieldRaw
forall a. [GeoFieldT a] -> GeoFieldT a
DataArray ([GeoFieldRaw] -> GeoFieldRaw)
-> Get [GeoFieldRaw] -> Get GeoFieldRaw
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Get GeoFieldRaw -> Get [GeoFieldRaw]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM (Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
fsize) Get GeoFieldRaw
forall t. Serialize t => Get t
get
        Word8
14 -> GeoFieldRaw -> Get GeoFieldRaw
forall (m :: * -> *) a. Monad m => a -> m a
return (GeoFieldRaw -> Get GeoFieldRaw) -> GeoFieldRaw -> Get GeoFieldRaw
forall a b. (a -> b) -> a -> b
$ Bool -> GeoFieldRaw
forall a. Bool -> GeoFieldT a
DataBool (Int64
fsize Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== Int64
0)
        Word8
_ -> do
          ByteString
_ <- Int -> Get ByteString
getBytes (Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
fsize)
          GeoFieldRaw -> Get GeoFieldRaw
forall (m :: * -> *) a. Monad m => a -> m a
return (GeoFieldRaw -> Get GeoFieldRaw) -> GeoFieldRaw -> Get GeoFieldRaw
forall a b. (a -> b) -> a -> b
$ Word8 -> Int64 -> GeoFieldRaw
forall a. Word8 -> Int64 -> GeoFieldT a
DataUnknown Word8
ftype Int64
fsize