Skip to content

Instantly share code, notes, and snippets.

@adacola
Created March 13, 2014 12:23
Show Gist options
  • Save adacola/9527437 to your computer and use it in GitHub Desktop.
Save adacola/9527437 to your computer and use it in GitHub Desktop.
https://gist.github.com/pocketberserker/8972681 をリファクタリング?してみた
type Emotion =
| Love
| Hate
type User = string
type Conversation = {
Affinity: Map<User * User, Emotion>
Message: Map<User * Emotion, string>
}
let template u1 u2 msg = sprintf "%s「%s?」\n%s「%s!」" u2 msg u1 msg
let inverse = function
| Love -> Hate
| Hate -> Love
//let generateSimple (u1: User) (u2: User) conversation : string option =
// if conversation.Affinity |> Map.containsKey (u1, u2) then
// let emotion = conversation.Affinity.[(u1, u2)]
// if conversation.Message |> Map.containsKey (u1, emotion) then
// Some (template u1 u2 (conversation.Message.[(u1, emotion)]))
// else None
// else None
let generateSimple u1 u2 conversation : string option =
conversation.Affinity |> Map.tryFind (u1, u2)
|> Option.bind (fun emotion ->
conversation.Message |> Map.tryFind (u1, emotion)
|> Option.map (template u1 u2))
//let generateComplex (u1: User) (u2: User) conversation : string option =
// let { Affinity = affinity; Message = message } = conversation
// if affinity |> Map.containsKey (u1, u2) && affinity |> Map.containsKey (u2, u1) then
// let emotion1 = affinity.[(u1, u2)]
// let emotion2 = affinity.[(u2, u1)]
// if emotion1 = emotion2 then
// if message |> Map.containsKey (u1, inverse(emotion1)) then
// Some (template u1 u2 (message.[(u1, inverse(emotion1))]))
// elif message |> Map.containsKey (u1, emotion1) then
// Some (template u1 u2 (message.[(u1, emotion1)]))
// else None
// else None
// else None
let generateComplex (u1: User) (u2: User) conversation : string option =
let { Affinity = affinity; Message = message } = conversation
[for us in [u1, u2; u2, u1] -> affinity |> Map.tryFind us |> Option.toList]
|> List.concat |> Seq.countBy id |> Seq.toList
|> function
| (e, 2)::[] ->
[inverse; id] |> Seq.tryPick (fun f -> message |> Map.tryFind (u1, f e))
|> Option.map (template u1 u2)
| _ -> None
let affinity =
Map.ofList
[
(("fuga", "pocketberserker"), Love)
(("pocketberserker", "fuga"), Love)
(("fuga", "hoge"), Hate)
]
let message =
Map.ofList
[
(("pocketberserker", Love), "F#")
(("fuga", Love), "Smalltalk")
(("fuga", Hate), "静的型付き")
]
let conv = { Affinity = affinity; Message = message }
// シンプルなgenerate
conv |> generateSimple "pocketberserker" "fuga" |> printfn "%A\n" // Some "fuga「F#?」\npocketberserker「F#!」"
conv |> generateSimple "fuga" "pocketberserker" |> printfn "%A\n" // Some "pocketberserker「Smalltalk?」\nhoge「Smalltalk!」")
conv |> generateSimple "fuga" "hoge" |> printfn "%A\n" // Some "fuga「静的型付き?」\nhoge「静的型付き!」")
conv |> generateSimple "hoge" "fuga" |> printfn "%A\n" // None
conv |> generateSimple "pocketberserker" "hoge" |> printfn "%A\n" // None
// 複雑なgenerate
conv |> generateComplex "pocketberserker" "fuga" |> printfn "%A\n" // Some "fuga「F#?」\npocketberserker「F#!」"
conv |> generateComplex "fuga" "pocketberserker" |> printfn "%A\n" // Some "pocketberserker「Smalltalk?」\nhoge「Smalltalk!」")
conv |> generateComplex "fuga" "hoge" |> printfn "%A\n" // None
conv |> generateComplex "hoge" "fuga" |> printfn "%A\n" // None
conv |> generateComplex "pocketberserker" "hoge" |> printfn "%A\n" // None
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment