Utils.purs 2.36 KB
Newer Older
1
module Gargantext.Utils where
2

3
import DOM.Simple.Window (window)
4
import Data.Either (Either(..))
5
import Data.Lens (Lens', lens)
6
import Data.Newtype (class Newtype, unwrap, wrap)
7
import Data.Set (Set)
8
import Data.Set as Set
9
import Data.String as S
10 11 12 13 14
import Effect (Effect)
import Effect.Class (liftEffect)
import FFI.Simple ((..))
import FFI.Simple.Functions (delay)
import Prelude
15

16 17 18
-- | TODO (hard coded)
csrfMiddlewareToken :: String
csrfMiddlewareToken = "Wy52D2nor8kC1r1Y4GrsrSIxQ2eqW8UwkdiQQshMoRwobzU4uldknRUhP0j4WcEM"
James Laver's avatar
James Laver committed
19

20 21 22 23 24 25
setterv :: forall nt record field.
           Newtype nt record
           => (record -> field -> record)
           -> field
           -> nt
           -> nt
26 27
setterv fn v t = (setter (flip fn v) t)

28 29 30 31 32
setter :: forall nt record.
          Newtype nt record
          => (record -> record)
          -> nt
          -> nt
33 34
setter fn = wrap <<< fn <<< unwrap

35 36 37 38 39
getter :: forall record field nt.
          Newtype nt record
          => (record -> field)
          -> nt
          -> field
40
getter fn = fn <<< unwrap
41 42 43 44 45 46

-- TODO: not optimal but Data.Set lacks some function (Set.alter)
toggleSet :: forall a. Ord a => a -> Set a -> Set a
toggleSet a s
  | Set.member a s = Set.delete a s
  | otherwise      = Set.insert a s
47 48 49 50 51 52 53 54 55 56

-- Default sort order is ascending, we may want descending
invertOrdering :: Ordering -> Ordering
invertOrdering LT = GT
invertOrdering GT = LT
invertOrdering EQ = EQ

-- A lens that always returns unit
_unit :: forall s. Lens' s Unit
_unit = lens (\_ -> unit) (\s _ -> s)
57

58
glyphicon :: String -> String
59
glyphicon t = "btn glyphitem fa fa-" <> t
60

61 62 63
glyphiconActive :: String -> Boolean -> String
glyphiconActive icon b = glyphicon icon <> if b then " active" else ""

64 65 66 67
-- | Format a number with specified amount of zero-padding
zeroPad :: Int -> Int -> String
zeroPad pad num = zeros <> (show num)
  where
68
    numDigits = S.length $ show num
69 70 71
    zeros = if numDigits < pad then zeros' (pad - numDigits) else ""
    zeros' 0 = ""
    zeros' n = "0" <> (zeros' (n - 1))
72 73 74 75 76

queryMatchesLabel :: String -> String -> Boolean
queryMatchesLabel q l = S.contains (S.Pattern $ normalize q) (normalize l)
  where
    normalize = S.toLower
77 78 79 80 81


mapLeft :: forall l m r. (l -> m) -> Either l r -> Either m r
mapLeft f (Left  l) = Left (f l)
mapLeft _ (Right r) = Right r
82 83 84 85 86 87 88

-- | Get current Window Location
location :: Effect String
location = delay unit $ \_ -> pure $ window .. "location"