80 lines
2.1 KiB
JavaScript
80 lines
2.1 KiB
JavaScript
/*eslint-disable */
|
|
import * as R from 'ramda'
|
|
|
|
/// TYPES ///
|
|
// const Category = {
|
|
// title: String,
|
|
// slug: String,
|
|
// resources: [Resource],
|
|
// }
|
|
|
|
// const RawResource = {
|
|
// title: String,
|
|
// desc: String,
|
|
// url: String,
|
|
// tags: [String]
|
|
// }
|
|
|
|
// const Resource = {
|
|
// title: String,
|
|
// cleanTitle: String,
|
|
// desc: String,
|
|
// path: String,
|
|
// url: String,
|
|
// tags: [String],
|
|
// }
|
|
|
|
/// FUNCTIONS ///
|
|
// isNotEmpty [a] -> Bool
|
|
export const isNotEmpty = R.compose(R.not, R.isEmpty)
|
|
|
|
// getAllResources :: [Category] -> [Resource]
|
|
export const getAllResources = R.compose(R.flatten, R.pluck('resources'))
|
|
|
|
// getAllTags :: [Category] -> [String]
|
|
export const getAllTags = R.compose(
|
|
R.uniq,
|
|
R.flatten,
|
|
R.pluck('tags'),
|
|
getAllResources
|
|
)
|
|
|
|
// tagsNotEmpty :: Resource -> Bool
|
|
export const tagsNotEmpty = R.compose(isNotEmpty, R.prop('tags'))
|
|
|
|
// cleanString :: String -> String
|
|
export const cleanString = R.compose(R.toLower, R.trim)
|
|
|
|
// removeSpacesLower :: String -> String
|
|
export const cleanStringAndRemoveSpaces = R.compose(R.replace(/ /g, ''), cleanString)
|
|
|
|
// true if list2 has element that appears in list1 else false
|
|
// includesElOf :: [a] -> [a] -> Bool
|
|
export const includesElOf = R.curry((list1, list2) => R.any(el => R.includes(el, list2), list1))
|
|
|
|
// Similar to includesElOf, but partially included strings are also allowed
|
|
// partiallyIncludesElOf :: [String] -> [String] -> Bool
|
|
export const partiallyIncludesElOf = R.curry((list1, list2) =>
|
|
R.any(el2 =>
|
|
R.any(R.includes(el2), list1),
|
|
list2)
|
|
)
|
|
|
|
// addCleanTitleAndPath :: RawResource -> Resource
|
|
const addCleanTitleAndPath = R.curry((slug, obj) => {
|
|
const cleanTitle = cleanStringAndRemoveSpaces(obj.title)
|
|
return {
|
|
...obj,
|
|
cleanTitle,
|
|
path: `${slug}?card=${cleanTitle}`,
|
|
}
|
|
})
|
|
|
|
// transformToResources :: [RawResource] -> [Resource]
|
|
export const transformToResources = categories => {
|
|
const resourcesLens = R.lens(R.prop('resources'), R.assoc('resources'))
|
|
return R.map(category =>
|
|
R.over(resourcesLens, R.map(addCleanTitleAndPath(category.slug)), category),
|
|
categories)
|
|
}
|