點燈坊

失くすものさえない今が強くなるチャンスよ

自行組合 isNonEmptyString() 判斷非 Empty String

Sam Xiao's Avatar 2020-03-17

Ramda 與 Crocks 都沒有提供 isNonEmptyString(),但我們可自行組合。

Version

macOS Catalina 10.15.3
VS Code 1.43.0
Quokka 1.0.282
Ramda 0.27.0
Crocks 0.12.3

Ramda

import { isEmpty, complement, allPass, is } from 'ramda'

let isNonEmptyString = allPass([
  complement(isEmpty), 
  is(String)
])

isNonEmptyString('') // ?
isNonEmptyString('abc') // ?

若使用 Ramda,要判斷 non empty string,有兩個條件:

  1. 必須是 string:is(String)
  2. 必須是 non-empty:complement(isEmpty)

且兩者都必須成立:allPass()

nonempty000

Crocks

import { isString, and, not, isEmpty } from 'crocks'

let isNonEmptyString = and(not(isEmpty), isString)

isNonEmptyString('') // ?
isNonEmptyString('abc') // ?

若使用 Crocks,判斷條件與 Ramda 一樣,不過使用 function 不太一樣:

  1. 必須是 string:Crocks 直接提供 isString(),不需用 is()String() 組合
  2. 必須是 non-empty:Crocks 也提供了 isEmpty(),與 Ramda 完全一樣,而 Crocks 的 not() 相當於 Ramda 的 complement(),而 and() 相當於 allPass()

nonempty001

Conclusion

  • Ramda 與 Crocks 有不少功能是重複的,有些 function 名稱完全一樣,有些則不同
  • Crocks 的 not() 與 Ramda 的 complement() 完全相同;而 Crocks 的 and() 也與 Ramda 的 allPass() 完全相同
  • 若以 API 角度,Crocks 的 not()and() 語意較佳,因為既然是 Functional Programming,所有的 function 都應該是針對其他 function 而來,而 Ramda 的 not() 是針對 value,也就是 !and() 也是針對 value,也就是 &&,實務上很少使用,還不如學 Crocks 將 not()and() 直接針對 function

Reference

Ramda, isEmpty()
Ramda, complement()
Ramda, allPass()
Ramda, is()
Crocks, isString()
Crocks, and()
Crocks, not()
Crocks, isEmpty()