Created
March 13, 2014 12:23
-
-
Save adacola/9527437 to your computer and use it in GitHub Desktop.
https://gist.github.com/pocketberserker/8972681 をリファクタリング?してみた
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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