packages feed

duckling-0.2.0.0: Duckling/Volume/Helpers.hs

-- Copyright (c) 2016-present, Facebook, Inc.
-- All rights reserved.
--
-- This source code is licensed under the BSD-style license found in the
-- LICENSE file in the root directory of this source tree.


{-# LANGUAGE GADTs #-}


module Duckling.Volume.Helpers
  ( isSimpleVolume
  , isUnitOnly
  , volume
  , unitOnly
  , valueOnly
  , withUnit
  , withValue
  , withInterval
  , withMin
  , withMax
  ) where

import Data.Text (Text)
import Prelude

import Duckling.Dimensions.Types
import Duckling.Volume.Types (Unit(..), VolumeData(..))
import Duckling.Types
import qualified Duckling.Volume.Types as TVolume

-- -----------------------------------------------------------------
-- Patterns

isSimpleVolume :: Predicate
isSimpleVolume (Token Volume VolumeData {TVolume.value = Just _
                                        , TVolume.minValue = Nothing
                                        , TVolume.maxValue = Nothing}) = True
isSimpleVolume _ = False

isUnitOnly :: Predicate
isUnitOnly (Token Volume VolumeData {TVolume.value = Nothing
                                    , TVolume.unit = Just _
                                    , TVolume.minValue = Nothing
                                    , TVolume.maxValue = Nothing}) = True
isUnitOnly _ = False

-- -----------------------------------------------------------------
-- Production

volume :: Unit -> Double -> VolumeData
volume u v = VolumeData {TVolume.unit = Just u
                        , TVolume.value = Just v
                        , TVolume.minValue = Nothing
                        , TVolume.maxValue = Nothing}

unitOnly :: Unit -> VolumeData
unitOnly u = VolumeData {TVolume.unit = Just u
                        , TVolume.value = Nothing
                        , TVolume.minValue = Nothing
                        , TVolume.maxValue = Nothing}

valueOnly :: Double -> VolumeData
valueOnly v = VolumeData {TVolume.unit = Nothing
                        , TVolume.value = Just v
                        , TVolume.minValue = Nothing
                        , TVolume.maxValue = Nothing}

withUnit :: Unit -> VolumeData -> VolumeData
withUnit u vd = vd {TVolume.unit = Just u}

withValue :: Double -> VolumeData -> VolumeData
withValue v vd = vd {TVolume.value = Just v}

withInterval :: (Double, Double) -> VolumeData -> VolumeData
withInterval (from, to) vd = vd {TVolume.value = Nothing
                                , TVolume.minValue = Just from
                                , TVolume.maxValue = Just to}

withMin :: Double -> VolumeData -> VolumeData
withMin from vd = vd {TVolume.minValue = Just from}

withMax :: Double -> VolumeData -> VolumeData
withMax to vd = vd {TVolume.maxValue = Just to}