espial-0.0.9: purs/src/Model.purs
module Model where
import Control.Monad.Except (runExcept)
import Data.Array (intercalate)
import Data.Either (hush)
import Data.Maybe (fromMaybe)
import Data.Nullable (Nullable)
import Data.String (Pattern(..), split)
import Foreign (Foreign, readInt, readString, unsafeToForeign)
import Foreign.Object (Object)
import Prelude (class Eq, pure, ($), (<$>))
import Simple.JSON as J
type BookmarkId = Int
type TagId = Int
type Bookmark =
{ url :: String
, title :: String
, description :: String
, tags :: String
, private :: Boolean
, toread :: Boolean
, bid :: BookmarkId
, slug :: String
, selected :: Boolean
, time :: String
, archiveUrl :: Nullable String
}
newtype Bookmark' = Bookmark' Bookmark
derive newtype instance J.ReadForeign Bookmark'
derive newtype instance J.WriteForeign Bookmark'
type NoteId = Int
type NoteSlug = String
type Note =
{ id :: NoteId
, slug :: NoteSlug
, title :: String
, text :: String
, length :: Int
, isMarkdown :: Boolean
, shared :: Boolean
, created :: String
, updated :: String
}
newtype Note' = Note' Note
derive newtype instance J.ReadForeign Note'
derive newtype instance J.WriteForeign Note'
type AccountSettings =
{ archiveDefault :: Boolean
, privateDefault :: Boolean
, privacyLock :: Boolean
}
newtype AccountSettings' = AccountSettings' AccountSettings
derive newtype instance J.ReadForeign AccountSettings'
derive newtype instance J.WriteForeign AccountSettings'
type TagCloudMode =
{ mode :: String
, value :: Foreign
, expanded :: Boolean
}
newtype TagCloudMode' = TagCloudMode' TagCloudMode
derive newtype instance J.ReadForeign TagCloudMode'
derive newtype instance J.WriteForeign TagCloudMode'
type TagCloud = Object Int
data TagCloudModeF
= TagCloudModeTop Boolean Int
| TagCloudModeLowerBound Boolean Int
| TagCloudModeRelated Boolean (Array String)
| TagCloudModeNone
derive instance Eq TagCloudModeF
tagCloudModeToF :: TagCloudMode -> TagCloudModeF
tagCloudModeToF tagCloudMode =
fromMaybe TagCloudModeNone $ hush $ runExcept $
case tagCloudMode.mode of
"top" -> TagCloudModeTop tagCloudMode.expanded <$> readInt tagCloudMode.value
"lowerBound" -> TagCloudModeLowerBound tagCloudMode.expanded <$> readInt tagCloudMode.value
"related" -> (\s -> TagCloudModeRelated tagCloudMode.expanded (split (Pattern " ") s)) <$> readString tagCloudMode.value
_ -> pure TagCloudModeNone
tagCloudModeFromF :: TagCloudModeF -> TagCloudMode
tagCloudModeFromF (TagCloudModeTop e i) =
{ mode: "top" , value: unsafeToForeign i, expanded: e }
tagCloudModeFromF (TagCloudModeLowerBound e i) =
{ mode: "lowerBound" , value: unsafeToForeign i, expanded: e }
tagCloudModeFromF (TagCloudModeRelated e tags) =
{ mode: "related" , value: unsafeToForeign (intercalate " " tags), expanded: e }
tagCloudModeFromF TagCloudModeNone =
{ mode: "none" , value: unsafeToForeign "", expanded: false }
isExpanded :: TagCloudModeF -> Boolean
isExpanded (TagCloudModeTop e _) = e
isExpanded (TagCloudModeLowerBound e _) = e
isExpanded (TagCloudModeRelated e _) = e
isExpanded TagCloudModeNone = false
isRelated :: TagCloudModeF -> Boolean
isRelated (TagCloudModeRelated _ _) = true
isRelated _ = false
setExpanded :: TagCloudModeF -> Boolean -> TagCloudModeF
setExpanded (TagCloudModeTop e i) e' = TagCloudModeTop e' i
setExpanded (TagCloudModeLowerBound e i) e' = TagCloudModeLowerBound e' i
setExpanded (TagCloudModeRelated e i) e' = TagCloudModeRelated e' i
setExpanded TagCloudModeNone _ = TagCloudModeNone
showMode :: TagCloudModeF -> String
showMode (TagCloudModeTop _ _) = "top"
showMode (TagCloudModeLowerBound _ _) = "lowerBound"
showMode (TagCloudModeRelated _ _) = "related"
showMode TagCloudModeNone = ""
-- isSameMode :: TagCloudModeF -> TagCloudModeF -> Boolean
-- isSameMode (TagCloudModeTop _ _) (TagCloudModeTop _ _) = true
-- isSameMode (TagCloudModeLowerBound _ _) (TagCloudModeLowerBound _ _) = true
-- isSameMode (TagCloudModeRelated _ _) (TagCloudModeRelated _ _) = true
-- isSameMode TagCloudModeNone TagCloudModeNone = true
-- isSameMode _ _ = false